gpt4 book ai didi

python - NumPy memmap 性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:32 25 4
gpt4 key购买 nike

我有一个大型 (75000 x 5 x 6000) 3D 数组,存储为 NumPy 内存映射。如果我只是像这样迭代第一个维度:

import numpy as np
import time

a = np.memmap(r"S:\bin\Preprocessed\mtb.dat", dtype='float32', mode='r', shape=(75000, 5, 6000))
l = []
start = time.time()
index = np.arange(75000)
np.random.shuffle(index)
for i in np.array(index):
l.append(np.array(a[i]) * 0.7)
print(time.time() - start)

>>> 0.503

迭代发生得非常快。但是,当我尝试在较大程序的上下文中迭代同一个 memmap 时,对 memmap 的单独调用将花费多达 0.1 秒,并且拉取所有 75000 条记录将花费近 10 分钟。

较大的程序太长,无法在这里重现,所以我的问题是:是否有任何已知问题可能导致 memmap 访问速度显着减慢,也许是在 Python 内存中保存了大量数据的情况下? p>

在较大的程序中,用法如下所示:

import time
array = np.memmap(self.path, dtype='float32', mode='r', shape=self.shape)
for i, (scenario_id, area) in enumerate(self.scenario_areas):
address = scenario_matrix.lookup.get(scenario_id)
if address:
scenario_output = array[address]
output_total = scenario_output * float(area)
cumulative += output_total # Add results to cumulative total
contributions[int(scenario_id.split("cdl")[1])] = output_total[:2].sum()
del array

第二个示例的执行时间超过 10 分钟。 scenario_output = array[address] 行(只是从内存映射中提取记录)的计时在 0.0 到 0.5 之间变化 - 提取单个记录需要半秒

最佳答案

据我所知,Python 中的内存映射没有任何独立于一般操作系统级别限制的限制。所以我猜你要么有操作系统级内存瓶颈(可能是不同大型 mmap 的缓存之间的交互),要么你的问题出在其他地方。

很高兴您已经有了一个引用实现,它显示了操作应该有多快。您需要系统地测试不同的可能原因。以下是一些有助于确定原因的说明。

首先,在引用实现和 上使用 cProfile 以更好地了解瓶颈所在。您将获得函数调用的列表以及每个函数所花费的时间。这可能会导致意想不到的结果。一些猜测:

  1. 大部分时间都花在您发布的代码中,这是真的吗?如果不是,分析可能会暗示另一个方向。
  2. self.scenario_areas 是类似列表的还是执行一些隐藏且昂贵的计算的迭代器?
  3. 可能是查找 scenario_matrix.lookup.get(scenario_id) 速度较慢。检查一下。
  4. contributions 是一个常规的 Python 列表或字典吗?还是它在幕后的分配中做了任何奇怪的事情?

只有当您验证时间实际上花费在 scenario_output = array[address] 行中时,我才会开始假设 mmap 文件之间的交互。如果是这种情况,请开始注释掉涉及其他内存访问的部分代码,并重复分析代码,以便更好地理解发生的情况。

我希望这会有所帮助。

关于python - NumPy memmap 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com