首页 > 解决方案 > 将大文件分块以成对处理条目并随后重新组合中间结果

问题描述

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

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

  1. 从阅读器中获取块,使用grouper()来自itertools 食谱
  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(),我认为使用迭代器的所有好处都在这里消失了,因为我将它们放在列表理解中。如果我只能使用迭代器会更好,以避免将整个文件读入内存。我不知道该怎么做...

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

三、从单独的子帧重建矩阵也不是很简单。

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

标签: pythonpython-3.xmultiprocessing

解决方案


推荐阅读