读取大文件,最快的方式是什么?

2018-05-05 07:51:25 +08:00
 sjmcefc2

for line in files:? 这个是读取大文件最快的方式吗

12391 次点击
所在节点    Python
54 条回复
AX5N
2018-05-05 19:16:26 +08:00
@AX5N 按我经验
如果瓶颈在 IO 上的话,一次直接把所有内容都读进内存是最快的。
如果瓶颈在对内容细致地分析 /计算上的话,例如你要遍历 10G 文本里每个字节的话,那就必须得换语言才行。
如果瓶颈在于整体的处理速度的话,例如你要压缩一段文件。那这个就随便了,随便读取一部分处理完再继续读取就好。
pathbox
2018-05-05 19:27:26 +08:00
逐行读取

分块读取

用 shell 脚本应该会很快很快
livc
2018-05-05 19:31:30 +08:00
awk ?
AX5N
2018-05-05 19:33:10 +08:00
@sjmcefc2 你这个文本有多少行?
AX5N
2018-05-05 19:48:54 +08:00
@sjmcefc2
100G 的文本有点夸张。

先说读取
假如你的硬盘是 HDD,按照 120M/s 来算的话,读取 10G 需要 850s ;
如果你的硬盘是 SSD,按照 450M/s 来算的话,需要 230s ;
无论你怎么来,无论你用什么办法,应该是不会慢过这个速度多少的,也不会快过这个速度多少。

再说处理
100G 的文本估计 10 亿行应该是有的吧,这个数量真的是太大了,单线程处理的话,python 速度慢的缺点会被暴露无遗。
所以建议你多进程、多线程来处理。

你这个每行之间没有联系,可以靠多线程来提高性能。如果碰上那种每行之间互有联系的,只能换 c++慢慢跑,python 绝对不行。
redsonic
2018-05-05 19:57:00 +08:00
像这类文件访存的效率问题都是处理时间和空间把戏。如果一个大文件要在短时间内随机访问上万次,用 mmap 应该是最好的。如果只是访问那么几次还不如 open write read。不过一般情况下无脑用 iostream 难道还不够快?
bfpiaoran
2018-05-05 23:11:17 +08:00
100G 不大 昨天我们这有读 6T 的 用的 seek 不知道速度怎么样。。。。
swulling
2018-05-06 00:28:54 +08:00
@sjmcefc2 你这个瓶颈不在 IO,是你具体处理逻辑太慢。你做个 Profile 就知道了
speedywind
2018-05-06 00:28:57 +08:00
不管什么语言,逐行读取肯定会慢一点,最快的方法是用 buff,
konakona
2018-05-06 00:29:35 +08:00
看要怎么处理,一般是分段分段(多少行到多少行,或者其他标识符号来记忆)提取后执行处理。
如果是要在 100GB 的文本里进行搜索……=v=呵呵呵呵呵呵呵呵
speedywind
2018-05-06 00:30:07 +08:00
一次读取 4k 的数据,因为一般现在分区都是 4k 对齐的
memorybox
2018-05-06 10:14:44 +08:00
这个问题其实有时候可以取巧处理的,比如用 parallel 工具,我觉得挺有意思,写了一篇文章,希望有帮助:

http://happy123.me/blog/2018/05/06/how-to-improve-performance-your-cmd-by-parallel/
sjmcefc2
2018-05-06 11:36:51 +08:00
@livc 目前只会 sed
@memorybox 这个可以试试。
BBCCBB
2018-05-06 12:36:39 +08:00
with open("file_name", 'r') as input:
for line in input:
#process


我记得这种就是流式读取的啊???

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

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

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

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

© 2021 V2EX