我一直在尝试将一个包含许多行(270亿)的大文件转换为JSON。googlecompute建议我利用多线程来提高写入时间。我已经将我的代码转换为:import json
import progressbar
f = open('output.txt', 'r')
r = open('json.txt', 'w')
import math
num_permutations = (math.factorial(124)/math.factorial((124-5)))
main_bar = progressbar.ProgressBar(maxval=num_permutations, \
widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage(), progressbar.AdaptiveETA()])
main_bar.start()
m = 0
for lines in f:
x = lines[:-1].split(' ')
x = json.dumps(x)
x += '\n'
r.write(x)
m += 1
main_bar.update(m)
为此:
^{pr2}$
我几乎直接从模块手册中复制了队列编码。在
以前,整个剧本需要两天时间。现在是说20天!我不太清楚为什么,有人能给我解释一下吗?在
编辑:这可以被认为是Python全局解释器锁(GIL)问题,但是,我不认为是这样-它不是计算密集型问题,是IO瓶颈问题,从线程文档来看:If you want your application to make better use of the computational
resources of multi-core machines, you are advised to use
multiprocessing. However, threading is still an appropriate model if
you want to run multiple I/O-bound tasks simultaneously.
我对此的理解是有限的,但我相信这是后者,即IO限制的任务。这是我最初想要多线程时的想法:IO调用阻塞了计算,IO调用可以将IO调用放在一个单独的线程中,以允许计算函数继续运行。在
进一步编辑:也许事实是我从输入中得到了一个IO块,这正是它减慢速度的原因。关于如何有效地将“for”循环发送到另一个线程有什么想法?谢谢!在