我正在使用multiprocessing.pool
进程处理一个巨大的文件,这些进程都写入一个输出文件。我将输入文件分成多个分区(基本上是2个元组的行索引,我后来传递给linecache.getline()
)并使用pool.map(func, list_of_partitions)
。在func
内,当前进程在其给定的分区上运行(保证不与任何其他分区重叠),然后在将结果写入单个输出文件之前,它获取一个锁,然后在写入后释放它完成。使用初始化程序创建锁,以便继承(取自this answer)以便跨进程共享。这是相关的代码:
l = multiprocessing.Lock() # lock
o = open("filename", 'w') # output
pool = multiprocessing.Pool(num_cores, initializer=init, initargs=(l, o,))
其中init
定义如下:
def init(l, o):
global lock, output
lock = l
output = o
我的问题是输出文件在随机位置丢失了一些文本。起初,我发现输出文件最后被截断了,但我确认当文件末尾添加许多空行并在中间找到另一个文本块时,它不是文件末尾的独占权。该文件也缺少部分。以下是预期文本块的示例:
Pairs: [(81266, 146942, 5)]
Number of pairs: 1
idx1 range: [81266, 81266]
idx2 range: [146942, 146942]
Most similar pair: (81266, 146942, 5)
Total similarity (mass): 5
这是一个被切断的区块:
Pairs: [(81267, 200604, 5)]
Number of pairs: 1
idx1 range: [81267, 81267]
idx2 range: [200604, 200604]
Most similar pair: (81267, 200604, 5)
Total similarity (ma
另一个更严重的案例:
Pairs: [(359543, 366898, 5), (359544, 366898, 5), (359544, 366899, 6)]
Number of pairs: 3
对于它的价值,我正在pool.close()
然后pool.join()
,虽然我删除它时问题仍然存在。
你能想到导致这种情况的事吗?当我正常运行代码没有并行性时,不会发生此问题。我将并行版本生成的文件中有效的完整输出文本块(如上面给出的示例)与非并行版本生成的文件块进行了比较,给出了相同的输入文件,并发现并行版本有137,073个有效块,而非并行块有137,114个有效块,所以我丢失了41个有效块(即41个不同的块被切断),这与块总数相比是一个非常小的数字,所以这真是莫名其妙我。非常感谢任何想法或建议!