29
回答
一个巨大文件的操作问题
开发十年,就只剩下这套Java开发体系了   

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

11000222

11122211

11122211

11111111

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

<无标签>
举报
ldl123292
发帖于5年前 29回/1K+阅
共有29个答案 最后回答: 5年前

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

--- 共有 1 条评论 ---
littledoo这个办法好。相当于省去了hash值计算的步骤,直接放入了。并且还是排好序的。 5年前 回复
cat file | uniq | sort -n > result

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

1.分成足够小的文件 2. 将每个小文件排序,去重。 3 递归合并文件,合并时可以再次去重复。 不知道是否可行。

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

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

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