请教高效分割 txt 大文件(100GB)方案( Python , Java , shell)

2020-04-09 18:16:29 +08:00
 Nick2VIPUser

一个 100G 的 txt 文件,按指定行内容分割为若干个文件,如何处理?
例如:这个文件有几亿行,其中会有大概 20 行的内容是”my content\t“
想以这个内容将文件分割开,如何在内存 16GB 的电脑上实现呢?

6690 次点击
所在节点    程序员
40 条回复
xupefei
2020-04-09 18:18:31 +08:00
边读边写,线性时间,内存占用超低。
littleylv
2020-04-09 18:21:11 +08:00
歪楼,为啥会有这样的文件啊,可怕
alan0liang
2020-04-09 18:21:15 +08:00
xupefei
2020-04-09 18:22:11 +08:00
如果是 ssd 的话,可以把文件分块后多线程扫描来拿到分隔符位置。对于每个位置,起一个线程从那个位置开始边读边写,直到遇到下一个分隔符。
vuuv
2020-04-09 18:22:23 +08:00
根据内容分割需要用 csplit 。
alan0liang
2020-04-09 18:23:05 +08:00
哦看错了 一楼流处理正解
luckyrayyy
2020-04-09 18:28:13 +08:00
你的难点在哪?如果说只是不能一次性读到内存,那就一边读一边处理呗。是否还有其他困难?
vuuv
2020-04-09 18:32:15 +08:00
毕竟只会生成 20 多个文件,都是顺序大块读写。
如果可能,写的目的地不要放在同一块磁盘上。
复制到 SSD 后能加快处理时的读取速度。但是你复制也要时间。自行决策吧。

提前创建个小文件测试下命令行参数效果。
Nick2VIPUser
2020-04-09 18:42:35 +08:00
@xupefei 是的~我的想法是读 2GB,然后逐行写入,依次循环。我打算先计算预计需要的时间...如果是读一行写一行,算了一下时间不能承受。
Nick2VIPUser
2020-04-09 18:43:23 +08:00
@littleylv 因为自己的某些 zhizhang 操作...哭了
Nick2VIPUser
2020-04-09 18:43:46 +08:00
@vuuv 我回去试试
yxt
2020-04-09 18:45:21 +08:00
emeditor?
Nick2VIPUser
2020-04-09 18:45:53 +08:00
@luckyrayyy 目前准备是按 2GB 分批读,然后逐行判断和写入,目前还在找 python 相关的 api 进行实现
Nick2VIPUser
2020-04-09 18:46:41 +08:00
@vuuv 是了~我打算放在 ssd 上跑一下
pcbl
2020-04-09 18:50:53 +08:00
反正才 100g 如果只是一次性处理的话,一行一行的读取都行,然后预估下内存最大可以放多少行在超出之前写入到文件
yxt
2020-04-09 18:50:53 +08:00
emeditor 最大支持大概 250g 先搜索,bookmark all,然后 split done
aptupdate
2020-04-09 18:52:11 +08:00
在 SSD 里面把线程拉满然后边读边写,你是想分割成 20 个文件吗?感觉分割完 20 个 5GB 大小的文件后续处理也够呛。好奇 100GB 的 txt 文件是什么东西……
also24
2020-04-09 18:53:40 +08:00
提醒下,边读边写方案,如果你是 HDD,最好分开在两个硬盘进行,或者读取一长段数据( x GB )后再一次性写入,避免大量的随机读写降低 IO 性能。

如果是 SSD 的话可以不用管这个。
caola
2020-04-09 18:55:43 +08:00
逐行读,判后再写入新文件……
line
2020-04-09 20:34:35 +08:00
cat | awk

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX