一个巨大文件的操作问题

ldl123292 发布于 2013/09/11 17:15
阅读 1K+
收藏 4

有一个11G的文本文件,里边存放的格式是

11000222

11122211

11122211

11111111

类似这种格式,一行一行的,每一行看成是一个字符串,怎么操作去掉里边重复的字符串,并且对剩下的字符串进行排序,用c或c++该怎么实现

加载中
2
公孙二狗
公孙二狗

11122211最大为99999999,开一个int array[1亿]的数据,也才400M 内存。例如读取到 n,则存入array[n - 1] = n; 最后输出都是排好序的。

l
littledoo
这个办法好。相当于省去了hash值计算的步骤,直接放入了。并且还是排好序的。
1
Oconnor
Oconnor
linux 直接一个命令解决 cat file | sort -u > newfile
eechen
eechen
回复 @ldl123292 : RedHat Cygwin GNU Coreutils
ldl123292
ldl123292
windows下
0
_________0
_________0
好庞大的文件
0
中山野鬼
中山野鬼
用hash会好些。。
0
仪山湖
仪山湖

1T的文件在重复度为2的情况下,有500G,用hash不现实,建议做归并去重

0
eechen
eechen
cat file | uniq | sort -n > result

说明:
uniq 去除重复行
sort -n 按数字排序(默认是升序)
sort -rn 按数字逆序排序(即降序)

0
lock_free
lock_free
1.分成足够小的文件 2. 将每个小文件排序,去重。 3 递归合并文件,合并时可以再次去重复。 不知道是否可行。
0
王瑞平
王瑞平
运算得运行狠长时间,不值得
0
玄聪
玄聪
总感觉是XX字典
0
中山野鬼
中山野鬼

引用来自“仪山湖”的答案

1T的文件在重复度为2的情况下,有500G,用hash不现实,建议做归并去重

他每行的字符串是有限的。可显示字符是0x20-0x7f。就算一个char能表示两个可显示字符,那么64个8位,可包含128个字符。只要每行是128个字符以内,还是足够用的。哈。
中山野鬼
中山野鬼
回复 @仪山湖 : 所以我放宽的是一个byte对应两个可显示字符,或许我用hash这个词并不准确,不过不用它,估计也不好说。实际是对字符串做数值计算,这个工作是一一映射的。
仪山湖
仪山湖
@中山野鬼 hash值的冲突是指不同的key经过hash函数计算出相同的hash值
中山野鬼
中山野鬼
回复 @仪山湖 : 我只是放宽分析一下,给个思路,至于空间,用bit就可以。而冲突表示相同。哈。
仪山湖
仪山湖
2^64^8的hash空间,这样的hash函数估计还没有产生咯,而且,hash函数的空间也不是连续的,所以需要更大的存储空间,还有,hash函数会产生重复的hash值,从hash的功能上说不能作为严格的唯一性实现方式
返回顶部
顶部