2

我正在使用 NumPy memmap 从整个大型二进制文件的各个位置加载少量数据(memmap'd、重塑、翻转,然后从大约 2 GB 的二进制文件加载大约 2000x1000 个点)。有五个 2 GB 文件,每个文件都有自己的内存映射对象。

内存映射的创建速度非常快。前几个文件中的数据片段很快就会被提取出来。但是,然后,它突然停在第四和第五档。内存使用率仍然很低,因此,它似乎没有将整个文件读入内存,但是来自进程的 I/O 访问很高。这可能需要十到十五分钟才能清除,然后一切都按预期进行。随后对所有内存映射的访问非常迅速,包括加载以前未触及的数据。内存使用率始终很低。关闭 Python 并重新运行,直到重新启动后问题才会再次出现(可能是缓存?)。

我在使用 Python 2.7 的 Windows 10 上。对故障排除有任何想法吗?

编辑:评论中有文件格式类型和示例代码的请求。不幸的是,我无法提供确切的细节;但是,我可以说这么多。文件格式仅包含 3D 数组的 int16 二进制值,可以通过格式 [n1, n2, n3] 重新整形,其中 n* 是每个维度的长度。但是,这些文件被拆分为 2GB。所以,它们是这样加载的:

memmaps = []
for filename in filelist:
    memmaps.append(np.memmap(filename, dtype=np.int16, mode='r'))
    memmaps[-1] = memmaps[-1].reshape([len(memmaps[-1])/n2/n3, n2, n3])
    memmaps[-1] = np.transpose(memmaps[-1], [2,1,0])

这当然不是世界上最干净的代码,但它通常可以工作,除了这个看似随机的减速。用户有一个滑块,允许他们从这个数组中绘制一个切片作为

image = np.zeros([n2, n1], dtype=np.int16)
#####
c = 0
for d in memmaps:
    image[:,c:(c+d.shape[2])] = d[slice,:,:]
    c = c + d.shape[2]

我遗漏了很多细节,但我认为这捕获了最相关的信息。

编辑 2:另外,我对处理这个问题的替代方法持开放态度。我的最终目标是将任意且相对较小的 2D 数据块实时交互式绘制为来自大型 3D 数据集的图像,该数据集可能被拆分为多个二进制文件。我目前正在使用 pyqtgraph,结果相当合理,除了这个随机问题。

4

0 回答 0