python多处理读取文件花费了太多时间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python多处理读取文件花费了太多时间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2197字,纯文字阅读大概需要4分钟。
内容图文
![python多处理读取文件花费了太多时间](/upload/InfoBanner/zyjiaocheng/796/6238f6656d714faf93b3480250caea53.jpg)
在我的代码中有一个函数应该读取文件.每个文件大约8M,但是读取速度太低,为了改善我使用multiprocessing.sadly,它似乎被阻止了.我想知道有没有方法有助于解决这个问题并提高阅读速度?
我的代码如下:
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/")
解决方法:
你有一些问题.首先,你没有并行化.你做:
result = pool.apply_async(gainOneFile,(abs_from_filename,))
arr.append(result.get())
一遍又一遍,调度一个任务,然后立即调用.get()等待它完成,然后再发出任何额外的任务;你实际上从未有过一个以上的工人.存储所有结果而不调用.get(),然后再调用.get().或者只是使用Pool.map或相关方法,并从手动的个人结果管理中节省一些麻烦,例如: (使用imap_unordered来最小化开销,因为你还是只是排序):
# Make generator of paths to load
paths = (os.path.join(path, "outputDict"+str(i)) for i in xrange(1, 40))
# Load them all in parallel, and sort the results by length (lambda is redundant)
arr = sorted(pool.imap_unordered(gainOneFile, paths), key=len)
其次,多处理必须对所有参数进行pickle和unpickle,并返回主进程和worker之间发送的值,并且所有这些都是通过管道发送的,这会引起系统调用开销.由于您的文件系统不太可能通过并行读取获得大幅度的速度,因此可能是净损失,而不是增益.
您可以通过切换到基于线程的池来获得一些提升;更改导入以导入multiprocessing.dummy作为mp,您将获得一个按线程实现的Pool版本;它们并不适用于CPython GIL,但由于这个代码几乎肯定是I / O绑定的,这几乎不重要,它消除了酸洗和去除以及工作者通信中涉及的IPC.
最后,如果您在类似UNIX的系统上使用Python 3.3或更高版本,您可以通过让文件更积极地将文件拉入系统缓存来帮助您.如果可以打开该文件,然后在文件描述符使用os.posix_fadvise(在文件对象.fileno())有两种WILLNEED或顺序,当你通过你面前积极预取文件数据从以后的某个点的文件读取它可能会提高读取性能请求它.
内容总结
以上是互联网集市为您收集整理的python多处理读取文件花费了太多时间全部内容,希望文章能够帮你解决python多处理读取文件花费了太多时间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。