请教一个关于海量数据的大文件统计问题

闻智 2015-01-14 12:27:21
有一个大文件 20多G 里面一行一行的(csv格式,逗号隔开的那种)都是订单信息 主要的有用户id 商户id 还有就是订单id 需要求出的就是求出“每个商户”“每天的累计支付用户”和“每天的新增支付用户数”
PS:
最好能贴出代码,
最好可以用C或C++,php也ok,
还有就是内存不是很大 需要考虑内存原因
我需要求出的“累计支付用户”和“新增支付用户数”的uid是需要去除重复的

最终的展现效果类似于这种


分不够可以再加啊
...全文
697 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2015-01-15
  • 打赏
  • 举报
回复
引用 18 楼 wen_ge 的回复:
[quote=引用 17 楼 ForestDB 的回复:] 推荐sqlite。
php的那个么?[/quote] 跟php没有太大关系,关键是推荐用数据库。
707wk 2015-01-15
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
楼主让无偿的hnwyllmm先试试吧。 不行的话再找有偿的zhao4zhong1
淡定
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 17 楼 ForestDB 的回复:
推荐sqlite。
php的那个么?
ForestDB 2015-01-14
  • 打赏
  • 举报
回复
推荐sqlite。
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 13 楼 ri_aje 的回复:
楼主反正准备拍点银子,不如先买根内存吧,这样你就不用操心 [quote=引用 楼主 wen_ge 的回复:] 还有就是内存不是很大 需要考虑内存原因
然后说不定问题就没那么复杂了,也省得求人了。[/quote]
引用 13 楼 ri_aje 的回复:
楼主反正准备拍点银子,不如先买根内存吧,这样你就不用操心 [quote=引用 楼主 wen_ge 的回复:] 还有就是内存不是很大 需要考虑内存原因
然后说不定问题就没那么复杂了,也省得求人了。[/quote] 我其实是比较喜欢技术 但是确实是不会 不过弄出来感觉比较爽 图个乐子吧
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
楼主让无偿的hnwyllmm先试试吧。 不行的话再找有偿的zhao4zhong1
hnwyllmm已经在做了,看看情况呗
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
架子搭好了:
//有一个大文件 20多G 里面一行一行的(csv格式,逗号隔开的那种)都是订单信息 主要的有
//订单id,用户id,商户id,日期
//1,11111,111111111,2013-01-01
//2,11111,222222222,2013-01-02
//3,11111,222222222,2013-01-02
//4,22222,222222222,2013-01-02
//5,22222,222222222,2013-01-03
//6,11111,333333333,2013-01-03
//7,33333,333333333,2013-01-03
//8,33333,111111111,2013-01-03
//需要求出的就是过去每天“每个商户”的“当天新增支付用户总数”和“累计支付用户总数”
//还有就是内存不是很大 需要考虑内存原因
//id是需要去除重复的
//结果类似:
//各商户当天新增支付用户总数
//商户id,2013-01-01,2013-01-02,2013-01-03,...
//111111111,1,0,1,...
//222222222,0,2,0,...
//333333333,0,0,2,...
//...
//各商户累计支付用户总数
//商户id,2013-01-01,2013-01-02,2013-01-03,...
//111111111,1,1,2,...
//222222222,0,2,2,...
//333333333,0,0,2,...
//...
#include <stdio.h>
int notin(int sid,int uid) {//sid之前没有uid的订单
    //TODO:快速判断sid之前没有uid的订单
}
void inc1uid(int sid,char *dt) {//将sid在dt这天的新增支付用户总数和累计支付用户总数都累加1
    //TODO:将sid在dt这天的新增支付用户总数和累计支付用户总数都累加1
}
int main(int argc,char **argv) {
    FILE *fi;
    char ln[4096];
    int did,uid,sid;
    char dt[11];

    if (argc<2) {printf("Usage:%s inputfile\n",argv[0]);return 1;}
    fi=fopen(argv[1],"r");
    if (NULL==fi) {printf("Can not open file %s!\n",argv[1]);return 2;}
    fgets(ln,4096,fi);
    while (1) {
        if (NULL==fgets(ln,4096,fi)) break;
        if (4==sscanf(ln,"%d,%d,%d,%s",&did,&uid,&sid,dt)) {
            if (notin(sid,uid)) inc1uid(sid,dt);
        }
    }
    fclose(fi);
    //TODO:输出所有dt对应的各商户当天新增支付用户总数
    //TODO:输出所有dt对应的各商户累计支付用户总数
    return 0;
}
就等楼主付款后我在DO了。 Just DO it!
ri_aje 2015-01-14
  • 打赏
  • 举报
回复
楼主反正准备拍点银子,不如先买根内存吧,这样你就不用操心
引用 楼主 wen_ge 的回复:
还有就是内存不是很大 需要考虑内存原因
然后说不定问题就没那么复杂了,也省得求人了。
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
楼主让无偿的hnwyllmm先试试吧。 不行的话再找有偿的zhao4zhong1
只要能做出来就不是无偿的
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
楼主让无偿的hnwyllmm先试试吧。 不行的话再找有偿的zhao4zhong1
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 9 楼 hnwyllmm 的回复:
[quote=引用 6 楼 wen_ge 的回复:] 其实仔细分析一下 这个题的难点是累计用户 我需要按时间把这些在不同商户下面的实际消费用户的uid(不重复)保留下来,然后下一天我需要查看过去的时间有在这个商户维度下进行过交易 累计需要占用很大空间和时间 累计出来后新增直接就上一天和今天的累计相减 那就是新增的了
这个记录商户UID的问题,按照我的思路,有问题联系我,无偿的 731851603,下班后一般都有时间[/quote]
羽飞 2015-01-14
  • 打赏
  • 举报
回复
引用 6 楼 wen_ge 的回复:
其实仔细分析一下 这个题的难点是累计用户 我需要按时间把这些在不同商户下面的实际消费用户的uid(不重复)保留下来,然后下一天我需要查看过去的时间有在这个商户维度下进行过交易 累计需要占用很大空间和时间 累计出来后新增直接就上一天和今天的累计相减 那就是新增的了
这个记录商户UID的问题,按照我的思路,有问题联系我,无偿的 731851603,下班后一般都有时间
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 wen_ge 的回复:] 现在主要困难是我不会C++ C语言。。。但是这个问题呢可能必须得用到这个知识 我现学又不行 时间紧任务重啊 你看图,我是需要跑从2013-01-01开始到现在的 我需要把它加到Linux的crontab里面 这样每天都运行一遍 所以尽量是高效率的完成~~如果你有能帮我解决这个问题 我付点钱都ok
有偿服务:email:zhao4zhong1@163.com[/quote] 方便加个q 1046045602
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
引用 5 楼 wen_ge 的回复:
现在主要困难是我不会C++ C语言。。。但是这个问题呢可能必须得用到这个知识 我现学又不行 时间紧任务重啊 你看图,我是需要跑从2013-01-01开始到现在的 我需要把它加到Linux的crontab里面 这样每天都运行一遍 所以尽量是高效率的完成~~如果你有能帮我解决这个问题 我付点钱都ok
有偿服务:email:zhao4zhong1@163.com
闻智 2015-01-14
  • 打赏
  • 举报
回复
其实仔细分析一下 这个题的难点是累计用户 我需要按时间把这些在不同商户下面的实际消费用户的uid(不重复)保留下来,然后下一天我需要查看过去的时间有在这个商户维度下进行过交易 累计需要占用很大空间和时间 累计出来后新增直接就上一天和今天的累计相减 那就是新增的了
闻智 2015-01-14
  • 打赏
  • 举报
回复
现在主要困难是我不会C++ C语言。。。但是这个问题呢可能必须得用到这个知识 我现学又不行 时间紧任务重啊 你看图,我是需要跑从2013-01-01开始到现在的 我需要把它加到Linux的crontab里面 这样每天都运行一遍 所以尽量是高效率的完成~~如果你有能帮我解决这个问题 我付点钱都ok
羽飞 2015-01-14
  • 打赏
  • 举报
回复
引用 2 楼 wen_ge 的回复:
[quote=引用 1 楼 hnwyllmm 的回复:] 数据读取问题不大,就是UID过滤,假设楼主的UID都是数字,或者可以转换成数字,20G的文件,一条数据100个字节,数量也不小,如果UID真的有这么多,建议楼主试试bitmap做过滤,UID过滤大概需要2G内存,如果楼主是32bit Windows系统,那就有点麻烦,还需要用磁盘做缓存 海量数据处理的算法这里介绍的有几个,楼主可以参考一下: http://blog.csdn.net/anhuidelinger/article/details/13591077
是在Linux下的 内存小确实是个问题,uid是很多的 因为是针对各个商户下发生交易,还有朋友你给的面试题我之前已经关注到了,但这个光是给了个思路,面试还可以,实际操作起来就很麻烦了,现在就麻烦再实际操作中了。。。[/quote] 如果把ID转化为数字,只有正数,1G内存就够了,用bitmap过滤 实际操作什么困难,可以描述一下,不要怕描述的麻烦,这个问题本来已经有点麻烦了
闻智 2015-01-14
  • 打赏
  • 举报
回复
看来真的是个难题~~~~~~
闻智 2015-01-14
  • 打赏
  • 举报
回复
引用 1 楼 hnwyllmm 的回复:
数据读取问题不大,就是UID过滤,假设楼主的UID都是数字,或者可以转换成数字,20G的文件,一条数据100个字节,数量也不小,如果UID真的有这么多,建议楼主试试bitmap做过滤,UID过滤大概需要2G内存,如果楼主是32bit Windows系统,那就有点麻烦,还需要用磁盘做缓存 海量数据处理的算法这里介绍的有几个,楼主可以参考一下: http://blog.csdn.net/anhuidelinger/article/details/13591077
是在Linux下的 内存小确实是个问题,uid是很多的 因为是针对各个商户下发生交易,还有朋友你给的面试题我之前已经关注到了,但这个光是给了个思路,面试还可以,实际操作起来就很麻烦了,现在就麻烦再实际操作中了。。。
羽飞 2015-01-14
  • 打赏
  • 举报
回复
数据读取问题不大,就是UID过滤,假设楼主的UID都是数字,或者可以转换成数字,20G的文件,一条数据100个字节,数量也不小,如果UID真的有这么多,建议楼主试试bitmap做过滤,UID过滤大概需要2G内存,如果楼主是32bit Windows系统,那就有点麻烦,还需要用磁盘做缓存 海量数据处理的算法这里介绍的有几个,楼主可以参考一下: http://blog.csdn.net/anhuidelinger/article/details/13591077

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧