【发布时间】:2016-03-24 18:00:06
【问题描述】:
我的代码中有一个函数应该读取文件。每个文件大约 8M,但是读取速度太低,为了改进我使用多处理。可悲的是,它似乎被阻塞了。我想知道有什么方法可以帮助解决这个问题并提高阅读速度?
我的代码如下:
import multiprocessing as mp
import json
import os
def gainOneFile(filename):
file_from = open(filename)
json_str = file_from.read()
temp = json.loads(json_str)
print "load:",filename," len ",len(temp)
file_from.close()
return temp
def gainSortedArr(path):
arr = []
pool = mp.Pool(4)
for i in xrange(1,40):
abs_from_filename = os.path.join(path, "outputDict"+str(i))
result = pool.apply_async(gainOneFile,(abs_from_filename,))
arr.append(result.get())
pool.close()
pool.join()
arr = sorted(arr,key = lambda dic:len(dic))
return arr
以及调用函数:
whole_arr = gainSortedArr("sortKeyOut/")
【问题讨论】:
-
看来问题是在主进程中收集数据期间的序列化/反序列化。
-
跳过中间字符串会获得适度的收益...
temp = json.load(file_from). -
这里没有mp收益。您在子进程中解码 JSON,但在返回父进程时必须再次对其进行序列化和反序列化。它可能比在一个文件中完成所有操作要慢。在这里,您的传输成本高,并行计算量低。
-
多处理
Value或Array使用共享内存......那里可能有一些好处。但您可能想尝试其他更快 (?) 的 json 解析器。 -
但我必须读取文件并对其进行解码。有什么解决方案吗?@tdelaney