使用 Python 处理大文件有什么推荐的方式么?

2017-09-23 02:14:15 +08:00
 linuxchild

大概五六个 G 的文件,目前分割成了数个小文件,使用 multiprocessing 这种处理了一下,但是效率还是太低了

请问哪位有什么推荐的方法?

另外,我在尝试使用 pp 这个库,不过总是提示变量未定义,实际上已经定义了,使用 multiprocessing 这种都不会提示这个错误,使用的代码如下:

cpu_num = 8
job_server = pp.Server(cpu_num)
a =  []
for f in xxxxx:
    a.append(job_server.submit(func_name, (f, )))
for x in a:
    tmp = x()

有这方面经验的朋友帮一下忙,感谢

8124 次点击
所在节点    Python
46 条回复
linuxchild
2017-09-23 02:28:56 +08:00
话说为什么不能 append 了…

再说具体一些吧,就是把文件内容读出来做一些处理然后存到另外的文件去。

不知哪位处理过类似的需求
runjvm
2017-09-23 04:17:38 +08:00
之前的办法大概需要多久…
laxenade
2017-09-23 04:28:57 +08:00
pyspark 跑个本地 spark
clino
2017-09-23 07:36:22 +08:00
你觉得瓶颈在哪里,搞清这个最重要
tonghuashuai
2017-09-23 08:15:55 +08:00
现在的效率是什么样的,你想达到的预期是什么样呢?

这个量级的文件跑几个进程去处理不至于会太慢,再不济三楼说的上 spark 也能比较快的解决,只是不知道你要求的效率什么样的。
FindHao
2017-09-23 08:57:52 +08:00
别用 Python,,,我去年做个实验,处理 1g 的数据,由于写的 Python 比较渣,一天只处理了几 m,花了半个多小时,写了个 c 版本,十几分钟就跑完了。。
kokutou
2017-09-23 09:05:06 +08:00
Python 写了个导出一个游戏数据的文本,要 3 ~ 4 秒的样子,用 c 写了个,1 秒不到。。。
pathbox
2017-09-23 09:44:51 +08:00
我会尝试用 go
cdwyd
2017-09-23 11:03:44 +08:00
@FindHao
是你自己的锅的可能性远大于 Python
princelai
2017-09-23 11:13:27 +08:00
spark 或 dask 试试
linuxchild
2017-09-23 11:13:36 +08:00
@runjvm 大概不到 1kw 行的数据,现在的速度是 1h 处理 5-6w … 要求的速度是不到一天处理完
Wicked
2017-09-23 11:16:08 +08:00
@FindHao 才 1G,用 JS 都不需要 1 天啊…
linuxchild
2017-09-23 11:20:29 +08:00
@laxenade 刚刚试了试。。妈蛋服务器上 spark 环境有问题
sunchen
2017-09-23 11:20:55 +08:00
300 多万 html,压缩后 80G,python 多进程在 4c8t 处理器上大约跑了 2 个小时做 html 解析,因为都是小文件,机械磁盘 IO 瓶颈,后期放到 ssd 上好了很多。供参考
laqow
2017-09-23 11:21:05 +08:00
以前弄过一些组学的文件,如果是纯文本的话不要用 for..in..语句,用 readlines 读入几千行后再用 readline 处理,如果是 utf8 之类非等长的字节编码的话先按 byte 编码读入文本必要时再解析成别的,最后把文件塞到内存盘再加个多进程。如果要求不高用 bash+awk 比 python 快很多。
linuxchild
2017-09-23 11:22:12 +08:00
@tonghuashuai 感觉是读取后处理文件比较慢…所以尝试分成了小文件,然后发现速度也没快,囧
hasdream
2017-09-23 11:22:20 +08:00
读取多行压缩放 redis 用多台机器消费 之前处理 mysql 审计日志 30g 大概一个小时搞定 3 台 i5 机器
Wicked
2017-09-23 11:23:12 +08:00
楼主先确定瓶颈在哪里,用 C++重写也就只有 2 ~ 3 倍的提升而已。对于大文件,Windows 下可以用内存映射的方式,多线程分别映射不同区域同时处理。8 核跑满应该也能提升个 5 ~ 6 倍吧
linuxchild
2017-09-23 11:23:13 +08:00
@FindHao 目前用了一些 py 的库,再改 C 的话感觉时间来不及…捉急
linuxchild
2017-09-23 11:29:52 +08:00
@pathbox 唔,还不会写 go


@princelai 我去搜一下


@sunchen 这个速度很快了啊,多进程用的什么库呢


@laqow 纯文本。读取后处理的过程用到了 py 的库……所以目前想看看使用 py 有没有什么解决办法


@hasdream 公司服务器…我装个什么东西都得审批,周末是没什么希望了


@Wicked 对,感觉其他语言重写可能也达不到我要求对速度。 不是 windows,跑在服务器上,后期还要搞成定时任务…所以要求肯定要一天内跑完

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

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

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

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

© 2021 V2EX