将大文件分成几块,以成对处理条目,然后重组中间结果

时间:2018-10-12 13:19:09

标签: python python-3.x multiprocessing

我有一个很大的文本文件(几个演出),其中包含数十万个条目。我需要成对处理,并生成类似相关矩阵的东西,除了它不是相关性而是我正在应用的自定义函数。我已经有一种方法,需要一个小文件(n = 500),并在几秒钟内计算出一个矩阵。我修改了此函数以接受两个集合,而不是一个,并根据i-> j而不是i-> i

进行计算

因此,为了以最有效的方式做到这一点,我想对输入文件进行分块并使用多个内核。我目前的方法如下:

  1. 使用来自itertools recipesgrouper(),从读者中获取大量信息
  2. 使用itertools.product()获取索引对(i,j)以获取块对
  3. 致电pool.starmap()以获得中间结果

参见下文:

def chunk_file(reader):
    def grouper(iterable, n, fillvalue=None):
        yield from itertools.zip_longest(*[iter(iterable)] * n, fillvalue=fillvalue)

    chunks = [chunk for chunk in grouper(reader, 1000)]

    chunk_pairs = [(chunks[i], chunks[j]) for i, j in itertools.product(range(len(chunks), len(chunks))) if i > j]
    with multiprocessing.Pool(args.nthreads) as pool:
        frames = pool.starmap(process_asym, chunk_pairs)
        return frames

但这不一定是一个好的解决方案,因为:

I。这不是grouper()的好用法,我认为使用迭代器的所有好处都消失了,因为我将它们放在了列表理解中。如果我只能使用迭代器,那会更好,以避免将整个文件读取到内存中。我不确定该怎么做...

II。我不确定我获取配对的方法是否特别聪明,也许我应该只传递索引,但是如何做到这一点呢?下游代码(即process_asym)是从条目(例如,chunk1和chunk2)中提取相关信息并调用高度精简的函数的位,该函数为一对条目(例如,chunk1_i和chunk2_j)计算最终结果。

III。从单个子帧重建矩阵也不是完全简单的。

我觉得这里必须有一个更明智的方法,因为这对于不断增长的数据集来说是一个相当普遍的问题。

0 个答案:

没有答案