我有一个大文件20GB
,超过 20万行,每行代表单独的序列化 JSON 。
将文件line by line
作为常规loop
阅读,并对在线数据执行操作需要花费大量时间。
是否有state of art
方法或best practices
用并行读取较小的块的大文件,以便加快处理速度?
我正在使用Python 3.6.X
答案 0 :(得分:1)
不幸的是,没有。读取文件并在读取的行上操作(例如json解析或计算)是一个CPU绑定操作,因此没有聪明的asyncio策略来加速它。在理论中,可以利用多处理和多个内核并行读取和处理,但是有多个线程读取同一个文件必然会导致严重的问题。因为你的文件太大了,把它全部存储在内存中,然后并行化计算也很困难。
最好的办法是通过将数据(如果可能的话)划分为多个文件来解决此问题,这样可以打开更安全的门与多核并行。抱歉,没有更好的答案AFAIK。
答案 1 :(得分:1)
有几种可能性,但首先要查找代码以找出瓶颈。也许你的处理会减慢一些可以加速的事情 - 这对多处理来说是非常可取的。 如果这没有用,你可以尝试:
使用其他文件格式。从文本中读取序列化的json并不是世界上最快的操作。因此,您可以存储数据(例如,在hdf5中),这可以加快处理速度。
实现多个可以读取文件部分的工作进程(worker1读取0-100万行,worker2 100万-20000万等)。您可以根据自己的需要使用joblib或芹菜来协调。整合结果是一项挑战,您必须了解您的需求(map-reduce style?)。由于没有比其他语言更真实的线程,这在python中更难,所以也许你可以为此切换语言。