C++读大数据量的txt文件,并处理其中的数据?

工东 发布于 2013/04/21 09:43
阅读 4K+
收藏 1
文件格式如下(假设有两列数据):
1   2
2   4 
3   4
1   2
3   5
1   2 

34343   45454
 

100000   100000
即假如文件中数值最大的为100000(10万)。有100万行数据,每一行代表一个数对(可以理解为一个二元组),每个二元组可能会出现多次,如“1   2”出现3次,那么定义数组A[1][2]=3,假如“1   3”没有出现,那么A[1][3]=0,以此类推。其实相当于构造出一个10万阶的矩阵,矩阵每个元素代表着相应二元组出现的次数。希望将矩阵中每个元素都写入到新的txt文档中。PS:以上是对这个问题的描述,当然这样的矩阵如何表示,能否表示,又是如何得到的是一个关键问题,本人菜鸟,望高手指教!

以下是问题补充:

@工东:其实这个问题就相当于求出图的邻接矩阵:如第一行“1 2”相当于图中节点1和节点2之间存在边,“1 2”出现的次数相当于边的权重。比如没出现“5 6”,即图中节点5和节点6之间不存在边的联系。根据已知的文件如何编程处理得到相应的邻接矩阵???PS:这是大规模的数据,假设节点数有10万个。 (2013/04/23 15:37)
加载中
0
杨超2
杨超2
用个std:map<int64, int>可以实现你的需求,其实key就是你所指的二元组,只不过这二个数字要合并成一个数,你不是说数值最大的为10W么,那就第一个数字乘上10W加上第二个数字作为key,插入到map中,第读到新的一行,就把二元组数字组合成单个数字作为key去查找,找到则加1,找不到则插入1,源文件处理完后,再遍历map,拆分key,把key取10W的模得第二个数,除以10W得第一个数,恢复二元组,而值就是个数,写入文件就行了。
0
杨超2
杨超2
或者用个二级map去查找也行,这样的话就不需要用int64了,只要单个值不超过40亿就好,数据结构应该是 std::map<int, std::map<int, int> >,这样就行了,其实思路是一样的。
0
工东

引用来自“杨超2”的答案

或者用个二级map去查找也行,这样的话就不需要用int64了,只要单个值不超过40亿就好,数据结构应该是 std::map<int, std::map<int, int> >,这样就行了,其实思路是一样的。
你提供的这两种思路都不错。我的问题中还要求这样的情况:如果“5   6”,这样的二元组没有出现,则相应的A[5][6]=0(可用这种方式来理解)。那么也希望将这种情况及其出现次数(即0)写入到txt文件中,又该如何处理呢。对这种大数据的处理,你有好的方法吗详细说下,谢谢!
杨超2
杨超2
也可以啊,你写文件的时候按顺序写就行了,从第一个数从1到10W遍历,第二个数也从1到10W遍历,每一个二元组都去查找map,找到就有值,找不到就是0,这样就行了么
0
Tuesday
Tuesday

洗洗睡吧. 你这只是纯粹的读数据做一个统计工作,其实没那么复杂.

csv表示毫无压力.

文件操作最难的是你定位到一个点上, 读并修改之.

0
工东

引用来自“Tuesday”的答案

洗洗睡吧. 你这只是纯粹的读数据做一个统计工作,其实没那么复杂.

csv表示毫无压力.

文件操作最难的是你定位到一个点上, 读并修改之.

详细说说看,csv怎么使用的
0
0
工东

引用来自“zhangqi_gsts”的答案

内存映射
能说下具体思路吗
0
Tuesday
Tuesday

引用来自“工东”的答案

引用来自“Tuesday”的答案

洗洗睡吧. 你这只是纯粹的读数据做一个统计工作,其实没那么复杂.

csv表示毫无压力.

文件操作最难的是你定位到一个点上, 读并修改之.

详细说说看,csv怎么使用的
csv是一行一个数组集...
返回顶部
顶部