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

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

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

12390 次点击
所在节点    Python
54 条回复
sjmcefc2
2018-05-05 08:04:40 +08:00
with open("file_name", 'r') as input:
for line in input:
#process
这种真的非常慢啊
sjmcefc2
2018-05-05 08:07:14 +08:00
100G 的文本。大家有好方式吗
swulling
2018-05-05 08:10:37 +08:00
clouduan
2018-05-05 08:16:11 +08:00
sjmcefc2
2018-05-05 08:34:50 +08:00
mmap 的话,如何逐行读取呢
NUT
2018-05-05 08:46:17 +08:00
java 用 RandomAccessFile 读流的时候判断是\n 就行
ltoddy
2018-05-05 08:50:40 +08:00
肯定是文件流啊,然后一部分一部分的读取.
fs.createReadStream()
LosLord
2018-05-05 09:01:40 +08:00
Java 有个根据指针读取的类
sjmcefc2
2018-05-05 09:11:51 +08:00
python 的 mmap 用行读取的方法?这样行吗,但是感觉还是很慢
with open(STAT_FILE, "r+b") as f:
m=mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line=m.readline()
if line == '': break
print line.rstrip()

必须其他语言?
sjmcefc2
2018-05-05 09:14:52 +08:00
主要用来按行读取,然后 split,然后判断每个字段的编码,java 有这些? go 能满足?速度如何?
qsnow6
2018-05-05 09:16:23 +08:00
之所以慢,是因为要一次性把大文件读取到内存中。
使用流就行了,不是换语言能解决的
sjmcefc2
2018-05-05 09:26:32 +08:00
@qsnow6 能给一个 python 流的例子吗
用 mmap,42m 读了 900 万条
yunpiao111
2018-05-05 09:26:47 +08:00
如果是文本类的话 单机多核可以用 pyspark
notreami
2018-05-05 09:36:53 +08:00
不读,最快。
sjmcefc2
2018-05-05 09:40:17 +08:00
@yunpiao111 混合编码文本,单机多核心,pyspark 有逐行读取的案例?貌似在 api 里面没看到逐行读取的。。。。
sjmcefc2
2018-05-05 09:40:39 +08:00
@notreami 太崇拜你了,哲学啊。
sjmcefc2
2018-05-05 09:42:49 +08:00
@qsnow6 流读取会把不可见的分隔符给搞掉吧,比如 hive 的^A
swulling
2018-05-05 09:52:08 +08:00
你得先找到瓶颈啊,别瞎猜测是读取慢。来来来我给你验证下。

人工生成 1000 万行的文件
$ time python ./numbers.py > out
python ./numbers.py > out 6.37s user 0.24s system 89% cpu 7.395 total

逐行读取,然后输出到 stdout,也就 7s 钟

你说『 42m 读了 900 万条』,那么瓶颈我觉得大部分是出在你的处理逻辑上,管读取什么事情?
crayygy
2018-05-05 09:52:53 +08:00
之前遇到过要读 10G 的文本,后来采取了先排序,分割,筛选一次,剩下差不多 2G,最后再进一步分段读取
swulling
2018-05-05 09:53:11 +08:00
用 Profile 去分析下耗时,优化要先分析,后优化。不能脑子一拍,肯定是 Python 大文件读取慢,就开始吭叽吭叽优化这个...

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

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

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

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

© 2021 V2EX