大概五六个 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()
有这方面经验的朋友帮一下忙,感谢
1
linuxchild OP 话说为什么不能 append 了…
再说具体一些吧,就是把文件内容读出来做一些处理然后存到另外的文件去。 不知哪位处理过类似的需求 |
2
runjvm 2017-09-23 04:17:38 +08:00 via Android
之前的办法大概需要多久…
|
3
laxenade 2017-09-23 04:28:57 +08:00 via Android
pyspark 跑个本地 spark
|
4
clino 2017-09-23 07:36:22 +08:00 via Android
你觉得瓶颈在哪里,搞清这个最重要
|
5
tonghuashuai 2017-09-23 08:15:55 +08:00 via iPhone
现在的效率是什么样的,你想达到的预期是什么样呢?
这个量级的文件跑几个进程去处理不至于会太慢,再不济三楼说的上 spark 也能比较快的解决,只是不知道你要求的效率什么样的。 |
6
FindHao 2017-09-23 08:57:52 +08:00 via Android
别用 Python,,,我去年做个实验,处理 1g 的数据,由于写的 Python 比较渣,一天只处理了几 m,花了半个多小时,写了个 c 版本,十几分钟就跑完了。。
|
7
kokutou 2017-09-23 09:05:06 +08:00 via Android
Python 写了个导出一个游戏数据的文本,要 3 ~ 4 秒的样子,用 c 写了个,1 秒不到。。。
|
8
pathbox 2017-09-23 09:44:51 +08:00 via iPhone
我会尝试用 go
|
10
princelai 2017-09-23 11:13:27 +08:00 via Android
spark 或 dask 试试
|
11
linuxchild OP @runjvm 大概不到 1kw 行的数据,现在的速度是 1h 处理 5-6w … 要求的速度是不到一天处理完
|
13
linuxchild OP @laxenade 刚刚试了试。。妈蛋服务器上 spark 环境有问题
|
14
sunchen 2017-09-23 11:20:55 +08:00
300 多万 html,压缩后 80G,python 多进程在 4c8t 处理器上大约跑了 2 个小时做 html 解析,因为都是小文件,机械磁盘 IO 瓶颈,后期放到 ssd 上好了很多。供参考
|
15
laqow 2017-09-23 11:21:05 +08:00 via Android
以前弄过一些组学的文件,如果是纯文本的话不要用 for..in..语句,用 readlines 读入几千行后再用 readline 处理,如果是 utf8 之类非等长的字节编码的话先按 byte 编码读入文本必要时再解析成别的,最后把文件塞到内存盘再加个多进程。如果要求不高用 bash+awk 比 python 快很多。
|
16
linuxchild OP @tonghuashuai 感觉是读取后处理文件比较慢…所以尝试分成了小文件,然后发现速度也没快,囧
|
17
hasdream 2017-09-23 11:22:20 +08:00 via Android
读取多行压缩放 redis 用多台机器消费 之前处理 mysql 审计日志 30g 大概一个小时搞定 3 台 i5 机器
|
18
Wicked 2017-09-23 11:23:12 +08:00 via iPhone
楼主先确定瓶颈在哪里,用 C++重写也就只有 2 ~ 3 倍的提升而已。对于大文件,Windows 下可以用内存映射的方式,多线程分别映射不同区域同时处理。8 核跑满应该也能提升个 5 ~ 6 倍吧
|
19
linuxchild OP @FindHao 目前用了一些 py 的库,再改 C 的话感觉时间来不及…捉急
|
20
linuxchild OP |
21
sunchen 2017-09-23 11:35:22 +08:00
@linuxchild multiprocessing 啊
|
22
Wicked 2017-09-23 11:39:34 +08:00 via iPhone
Linux 应该也有类似的机制,可以查下文档。还是建议 profile 先,先从算法本身优化,热点再用 C++写一下。如果你要干的事情确实就有这么多,那你唯一可以干的就是把 CPU 吃满,换 SSD,加机器
|
23
laqow 2017-09-23 11:49:07 +08:00 via Android
感觉 python 原生解析文本的几个函数效率很低,没压缩只有几个 G 的文件问题可能在这里,应该和多进程无关
|
25
gamexg 2017-09-23 11:58:04 +08:00
>>现在的速度是 1h 处理 5-6w
6w/60/60 = 16.66666666666667 1 秒不到 17 条? 不知道读出来做的什么处理,所以不确定是不是出问题的地方。 你先试试只读取+处理不写看看性能,怀疑每次写都强制 sync 了。 |
26
billion 2017-09-23 11:59:55 +08:00
我有处理 40G 文本文件的经验。
我的文本文件每一行都是一个 JSON,用 Python 读取出来,再把每一行的 JSON 转成字典并插入到 MongoDB 中。使用 Python 的 readline()一行一行读,凑够了 10000 个字典以后一次性插入 MongoDB,亲测单线程单进程 4 个小时不到就跑完了。 |
27
aru 2017-09-23 12:31:40 +08:00
|
28
scys 2017-09-23 12:31:44 +08:00
建议你重点在优化算法逻辑处理部分,py 读 /写文件不是关键点。
尝试下 pypy 看能不能改善。 |
29
linuxchild OP |
30
linuxchild OP |
31
laxenade 2017-09-23 13:25:06 +08:00
假设一小时单线程能处理 6w 行,那四核(超线程在这里的用途应该不大)的服务器一天也只能跑 576w 行呢。所以你有可能需要换一个更快的库或者换一个语言(
|
32
scys 2017-09-23 13:28:56 +08:00
加解密你找个有 C 的模块,快起码不是一个数量级。
或者你说说你现在有的啥模块? |
33
est 2017-09-23 13:39:14 +08:00
dask
mmap |
34
linuxchild OP @laxenade 服务器上跑的话,如果这样算,也只能尝试多几用几个核了……
@scys 用的 pycrypto …有什么推荐的模块么 @est 刚刚试了一下 dask ``` from dask import delayed #import dask.bag as db L = [] for fn in en_files: # b = db.read_text(fn) a = delayed(fun_name)(fn) # Delay execution of function L.append(a) result = delayed(L) result.compute() ``` 使用这种方式处理,发现和下面这种方式处理效率相似,看了看 cpu 占用率也很相似,大概都是单核 100%左右 ``` #pool = ThreadPool(20) #pool.map(decrypt_file, encrypt_files) #pool.close() #pool.join() ``` 话说这是我使用方式的问题,还是什么? |
35
laxenade 2017-09-23 14:46:17 +08:00
@linuxchild #34 所以差不多要 8 核 16 线程才能满足呢
|
36
linuxchild OP |
37
scys 2017-09-23 15:59:38 +08:00
|
38
scys 2017-09-23 16:04:18 +08:00
|
39
laqow 2017-09-23 16:12:43 +08:00 via Android
可能还是在 io,for fn in en_files 这个依赖系统硬盘缓存的,如果行数多但每行字少的时候很慢,主进程一次一行的分配任务会把主进程的 cpu 耗尽,不如一次 readlines 几千行塞到各个进程里在内存里由各个进程逐行处理。而且不知道为什么 python 解析 utf8 奇慢,全英文的转成其他编码的再处理。我以前遇到是这种问题。
|
40
numoone 2017-09-23 17:09:50 +08:00
难道都没看到楼主要处理的主要是加解密吗?瓶颈绝对值这啊!加解密模块用 C 来写吧!
|
41
likuku 2017-09-23 17:22:49 +08:00
找个能支持 CPU 硬件加解密加速器的库 /加解密库试试
|
42
jhdxr 2017-09-23 19:41:08 +08:00
最简单的答案是换 java/c/c++
有性能要求的 Python 永远不是第一选择 |
43
fiht 2017-09-23 19:50:57 +08:00
换 pypy 可解(应该
|
44
linuxchild OP |
45
afpro 2017-09-24 00:44:20 +08:00
这种玩意 感觉上 Cython 或者 Pypy 效果会很不错
|
46
linuxchild OP |