【问题标题】:Is there a memory limit on np.fromfile() method?np.fromfile() 方法是否有内存限制?
【发布时间】:2019-02-06 00:50:38
【问题描述】:

我试图在np.fromfile() 的帮助下将一个大文件读入数组,但是,在一定数量的字节之后,它给出了 MemoryError。

with open(filename,'r') as file:
    data = np.fromfile(file, dtype=np.uint16, count=2048*2048*63)
    data = data.reshape(63, 2048, 2048)

它适用于 2048*2048*63,但不适用于 2048*2048*64。如何调试这个?我想知道这里的瓶颈是什么?

编辑:我在 Windows 10 上运行,RAM 256GB,它是一个独立的脚本,64 位 Python。

Edit2:我遵循了 cmets 的建议,现在在 128*2048*2048 处出现错误,在 127*2048*2048 上工作正常。

【问题讨论】:

  • 你有多少内存,你的系统是多少?
  • 你有多少内存?您的交换/页面文件有多大?这是独立代码,还是具有其他大量分配的更大程序的一部分?您运行的是 32 位还是 64 位版本的 Python?我们需要更多细节来提供有用的答案。
  • 256GB RAM,但 python 无法处理?
  • 2048 * 2048 * 2 * 64 = 0.5 GiB。应该不是问题。除非你做几千次​​pan>
  • 作为记录,在 Windows 上的 Ubuntu bash 上运行的 64 位 CPython 3.7.1 上,我无法重现(而且我的 RAM 比你少 ,只有 12国标)。它可以很好地加载和重塑(如果我将其从 np.reshape 更改为 data.reshape)。虽然这不太重要,但了解您正在运行的操作系统和特定 Python 版本会很有用。

标签: python numpy memory


【解决方案1】:

尽管您相信,您已经在 64 位操作系统上安装了 32 位版本的 Python,这意味着虚拟地址空间在用户模式下被限制为只有 2 GB,并尝试分配 1 GB 的连续块由于地址空间碎片,或更多可能很容易失败。

赠品是您的sys.maxsize,它只是您的 Python 构建中 C ssize_t 可表示的最大值。 2147483647 对应于 2**31 - 1,这是 32 位 Python 上的预期值。 64 位版本会报告 9223372036854775807 (2**63 - 1)。

卸载 32 位版本的 Python 和 download/install a 64 bit version (link is to 3.7.2 download page)(查找标记为 x86-64,不是 x86 的安装程序;文件名将包括 amd64)。令人讨厌的是, the main page for downloading Python默认值可为Windows提供32位版本,因此您必须向下滚动到指向特定版本下载页面的链接,单击最新版本,然后按OS滚动到完整列表,然后选择适当的列表。

【讨论】:

  • 你们是对的,我错过了错误的 python 解释器。幸好早想通了。谢谢大家。
猜你喜欢
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多