速度可以稍慢一点,但也不能太慢(一两个小时跑不完那种 不使用 Spark 之类的计算引擎 麻烦大佬们给小弟个解决方案
速度可以稍慢一点,但也不能太慢(一两个小时跑不完那种 不使用 Spark 之类的计算引擎 麻烦大佬们给小弟个解决方案
|
1
2G 算啥大文本,不要求保持原始顺序的话直接 `sort -u` 就行了。
|
|
skypybNov 10, 2020
2
可以接受一点点误差的话
布隆过滤器 |
|
loliordieNov 10, 2020 via Android
3
随便挑个语言 load 到内存里 o(n)复杂度迭代一次就完事了
会用 pandas 用 pandas 不会就用 python 的 set 来实现 处理速度基本等同于 io 的速度 |
|
liangfengmarkNov 10, 2020
4
python set
|
|
5
@loliordie 好吧,我没说清楚,我们同时间可能会有多个这种去重的任务。
|
|
6
@loliordie 正解,2g 直接内存
|
|
GMNov 10, 2020
7
直接 sort -u,磁盘速度够的话,一分钟完事
|
|
8
2G 直接哈希表都能搞定,甚至直接 awk 一行命令:
awk '!a[$0]++' input.txt > output.txt |
|
t6attackNov 10, 2020
9
<?php
ini_set('memory_limit',-1); $array = file('源文件.txt'); $array = array_unique($array); file_put_contents('输出文件.txt',implode($array,"")); ?> 我一直用的方法。也就上面有人说的,直接内存处理。 |
|
10
@sl19981007 取决于你的 tradeoff 是空间复杂度优先还是时间复杂度优先
如果是要多个任务同时处理时间复杂度优先 内存够大直接搞个 celery 之类的多线程库就行了 内存不够大就锁队列 只允许 n 个任务同时运行 更简单一点可以输入多个路径 挨个处理 连多线程库都不用上 就是同时只能有一个任务正在运行 但你这个需求 最大瓶颈在于硬盘 io 所以多个并行或者串行影响都不大 |
|
11
|
|
aladdindingdingNov 10, 2020
12
linux 命令就行 sort | unique
|
|
MOONLIGHTTNov 10, 2020
13
别自己写,用 linux 的内建命令
|
|
knightdfNov 10, 2020
14
2G 而已,sort 都挺快的
|
|
hotpot6147Nov 10, 2020
15
2g 的文本直接 load 进内存,然后 hash 去重就可以了。
如果 pc 机内存不够可以对每行数据进行 hash 后取模分布在 n 个文件中,然后再将这 n 个文件分别 load 进内存去重 |
|
BBCCBBNov 10, 2020
16
我感觉这种都是先遍历, 按文本 hash 拆分成足够小的文件, 然后在内存足够的情况下去处理每个小文件, 最后 merge 起来就完成了你说的需求了..
一般都是按 hash 拆分, 然后处理每个小文件, 最后再合并. |
|
BBCCBBNov 10, 2020
17
不过这是针对超大文件的, 你这个 2G 真的可以试试直接 load 到内存.
|
|
XusuallyNov 10, 2020
18
我开个脑洞,存数据库里。单行内容做主键,不停按行 insert,emmm......
|
|
gainsurierNov 10, 2020
19
emeditor,十几秒搞定
|
|
aec4dNov 10, 2020
20
瓶颈是磁盘 IO, 针对选一个 hash https://github.com/rust-lang/hashbrown,按行读取,如果 hash 值已存在则跳过,猜测十秒能完成吧
|
|
janxinNov 10, 2020
21
这数据量直接 load 到内存里怎么玩都行
|
|
NCENov 10, 2020
22
这应该是个面试题
|
|
winglight2016Nov 10, 2020
23
@NCE 的确,我在金山面试 android 时有被问过类似问题
|
|
nowgooNov 10, 2020
24
linux 环境 sort/awk,windows 环境 editplus/emeditor
|
|
rainfdNov 10, 2020
25
sort | unique
|
|
m30102Nov 10, 2020
26
LinekdHashSet 行不?
|
|
MohansonNov 10, 2020
27
任意"去重"或"排序"的面试题答"字典树"绝对得分的.
|
|
mogami18Nov 11, 2020
30
我還以為是 2T
|
|
oneoynNov 11, 2020 via Android
31
2G 我的 cpu 可以秒开
|
|
newmlpNov 11, 2020
33
2g 而已,全部读到内存就完事了
|
|
vincent7245Nov 11, 2020
34
所以你为什么不用 spark 呢 /狗头
|
|
loliordieNov 11, 2020
35
@fewok 你可能需要理解下 O(n)复杂度的意义, 大 O 计算法考察的是时间规模跟输入规模的关系, 哈希表复杂度为 O(1), 不会影响时间复杂度, 除非你使用了 listnode 这样的结构, 每次查询元素时都会迭代, 随着输入规模的增加查询时间也会增加这样才会导致复杂度从 O(n)变为 O(n^2)
|
|
hxy100Nov 11, 2020
36
Linux 直接上 sort 或者 uniq 命令即可,Windows 下的话直接 Emeditor 打开,点一下去重按钮就完事。
|