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

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

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

6417 次点击
所在节点    程序员
40 条回复
rayray314
2020-04-09 21:07:03 +08:00
emeditor
cheng6563
2020-04-09 21:47:00 +08:00
就算是 HDD 同盘复制缓冲区给个 50M 就行了,没必要上 GB
lululau
2020-04-09 22:20:20 +08:00
zsh:

offsets=($(echo 1; grep -b 'my content' big.log | cut -d: -f1; stat -c%s big.log))
for ((i=1; i < $#offsets; i++)) { echo dd if=big.log of=small.$i.log bs=1 count=$[$offsets[i+1]-$offsets[i]] skip=$[$offsets[i]-1] }
lululau
2020-04-09 22:20:49 +08:00
zsh:

offsets=($(echo 1; grep -b 'my content' big.log | cut -d: -f1; stat -c%s big.log))
for ((i=1; i < $#offsets; i++)) { dd if=big.log of=small.$i.log bs=1 count=$[$offsets[i+1]-$offsets[i]] skip=$[$offsets[i]-1] }
lniwn
2020-04-09 23:32:28 +08:00
mmap 内存映射,一个映射读的文件,一个映射写的文件,64mb 一个块,一个块 commit 一次,hdd 没有任何压力。
qinrui
2020-04-09 23:51:57 +08:00
awk 一行一行的读
scriptB0y
2020-04-09 23:58:03 +08:00
直接用 fileinput,无论按照什么逻辑分割都能三五行搞定

https://docs.python.org/3.8/library/fileinput.html
rrfeng
2020-04-10 00:13:57 +08:00
sed
awk
都能轻易完成…
popbones
2020-04-10 00:27:12 +08:00
msg7086
2020-04-10 00:35:15 +08:00
读进 buffer 然后扫描分割就行了吧。
一次读比如说 128M,扫描完,再读下一块,如果能多线程跑更好,IO 扔给子线程。
marcomarco
2020-04-10 07:33:56 +08:00
txtkiller 了解一下
sxfscool
2020-04-10 08:44:11 +08:00
bufio
dantegg
2020-04-10 08:53:40 +08:00
sed +1
BlackBerry999
2020-04-10 10:01:05 +08:00
按行读,边读边写。
matepi
2020-04-10 10:06:02 +08:00
边读边写不就完了么

真正难的是让你快速定位到随机第 n 行的内容
zz554952942
2020-04-10 10:35:14 +08:00
go
开一个生产者协程 负责读取文本 读到换行符则塞到通道上
然后开一定量的消费者协程负责取然后写入
llussy
2020-04-10 11:15:05 +08:00
split -b 10G log.txt newfile
feelinglucky
2020-04-10 12:18:30 +08:00
@littleylv 以前很多日志都还存文件系统的时候,一天就要好几百 G 了…🤣
augustheart
2020-04-10 14:07:18 +08:00
逐字节线性读入就行。你只需要长度为“my content\t”的缓存就行
JimiJimi
2020-04-23 09:46:33 +08:00
流处理,一行一行读

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

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

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

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

© 2021 V2EX