【问题标题】:Sum of values accessed through numpy memmap is wrong通过 numpy memmap 访问的值的总和是错误的
【发布时间】:2018-04-18 20:48:41
【问题描述】:

我有一个大 (9.3 GB) .npy 文件,其中包含 (67000, 9, 128, 128) ndarray 中的 uint8 值。我使用np.save() 创建它,当使用x = np.memmap('file.npy', "uint8", shape=(67000, 9, 128, 128), mode="r") 加载它时,np.sum(x[0,0,:,0]) 返回 13783。“问题”是当我尝试使用np.load("file.npy") 加载它并运行相同的函数时,总和为 13768。

由于np.load() 将整个文件加载到内存中,我假设在其 ndarray 上计算的总和是正确的,而使用 memmap 加载的 ndarray 返回的总和是错误的,但为什么它们不同?如果这是一个阅读错误,那么总和应该是真的关闭了,那为什么它只减少了 15 ??!

我不知道为什么会这样。这不会影响我的计算每个人说,但它可能对其他任务很重要。

【问题讨论】:

  • 你能用更小的数组重现这个问题,这样它就可以打印映射的版本和加载的版本了吗?
  • npy 文件有一个标题,但 memmap 映射原始字节。

标签: python numpy memory


【解决方案1】:

numpy.memmap 用于将文件中的 原始数据 视为 numpy 数组。你的文件名是'file.npy',所以这不是“原始”数据。它是一个 NPY 文件,其中有一个包含存储在其中的数组的元信息的标头。

要对 NPY 文件进行内存映射,请使用 numpy.load()mmap_mode 参数。

【讨论】:

  • 谢谢,效果很好!我现在使用 viddata = np.load(viddata_path, mmap_mode="r+") 。但是,稍后我需要将我的 ndarray 转换为 float32 dtype 但我遇到了 MemoryError 这是我首先要避免的。有什么建议吗?
  • 或许可以分批工作?确实,有关内存管理的问题太宽泛,无法在 stackoverflow cmets 中处理。如果您无法弄清楚,请再问一个 SO 问题。
  • 好的,谢谢你,对于阅读这篇文章的人,我发现Dask 可以帮助处理多达 100 个 Go 数组,并且与 numpy ndarrays、pandas DataFrame 和 scikit-learn 兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多