python - 将大文件分块以成对处理条目并随后重新组合中间结果
问题描述
我有一个包含数十万条目的大型文本文件(几个演出)。我需要成对处理这些,并生成类似相关矩阵的东西,除了它不是相关性而是我正在应用的自定义函数。我已经有一个方法,它需要一个小文件(n = 500)并在几秒钟内计算一个矩阵。我已修改此函数以接受两个集合,而不是一个,并从 i-> j 计算,而不是 i-> i
因此,为了以最有效的方式执行此操作,我想对输入文件进行分块并使用多个内核。我目前的做法如下:
- 从阅读器中获取块,使用
grouper()
来自itertools 食谱 - 用于
itertools.product()
获取索引对 (i, j) 以获取块对 - 调用
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)的最终结果的位。
三、从单独的子帧重建矩阵也不是很简单。
我觉得这里必须有一个更聪明的方法,因为这应该是不断增长的数据集的一个相当普遍的问题。
解决方案
推荐阅读
- php - 从多维数组中提取值并存储在单独的数组中
- excel - 尝试编写一个 If 语句,该语句将显示最后选择的项目的日期并更改为更新
- kinect - 哪一个?DTWi 还是 DTWd?
- python - excel文件到dat文件的转换不完整
- python - 如何同时遍历 pandas 的列和行?
- php - Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 无消息 Laravel 5.8 和 Ajax
- reactjs - 从状态检索的数据未显示在 FlatList 中
- r - 有没有办法根据条件计算数组中的列?
- c++ - 通过向量下标访问 Fortran 数组,等效 cpp
- python - 如何选择具有相同类名的第二个 div 标签?