【问题标题】:python.exe crushed while creating numpy array [closed]python.exe在创建numpy数组时被粉碎[关闭]
【发布时间】:2014-04-15 10:13:38
【问题描述】:

我正在尝试在 x32 机器上执行此代码

rows=100000
cols=1000

def create_matrix(rows,cols):
    data = (np.random.rand(rows,cols)*100).astype('uint8')
    return data

但是python.exe被压死了,是什么原因? (我认为它不是 x32 内存限制?因为这样的数组只需要 ~100 mb)。

【问题讨论】:

  • 实际上,在最高内存负载下,这将占用大约 1.6 GB。你有多少可用内存?
  • 你有追溯吗?
  • @Wooble 不只是崩溃。

标签: python python-2.7 memory numpy


【解决方案1】:

最终输出只需要大约 100 MB。但是,最终输出并不是您分配的唯一数组。

np.random.rand(rows,cols)

这是一个包含 1 亿个 float64 的数组。大约需要 800 MB。

np.random.rand(rows,cols)*100

这是另一个包含 1 亿个 float64 的数组。它还需要大约 800 MB。在计算时,这个数组和前一个数组都必须保留在内存中,峰值内存使用量约为 1.6 GB,比您预期的高 16 倍。

NumPy 似乎没有提供直接生成随机 uint8 的方法。但是,您可以通过使用 numpy.random.randint 生成 int32s 而不是 float64s 并跳过临时分配,将此函数的峰值内存使用量降低到大约 500 MB:

return np.random.randint(0, 100, (rows, cols)).astype('uint8')

如果这仍然太高,您可以生成块中的随机数并将它们切片分配到结果数组中,从而减少您需要立即保存在内存中的临时 int32 的数量:

data = np.zeros([rows, cols], dtype='uint8')
for chunk_start in xrange(0, rows, rows/10):
    data[chunk_start: chunk_start+rows/10] = (
            np.random.randint(0, 100, (rows/10, cols)))
return data

此版本的内存使用峰值应约为 140 MB。

【讨论】:

  • 好的,我明白了,但是为什么python崩溃了,为什么它没有显示一些内存不足的错误? (我的 x32 机器上有 2 Gb 的内存)。
  • @mrgloom:你所说的“粉碎”是什么意思?这是一个非常模糊的错误报告。
  • 没有回溯,控制台关闭,只有信息是:AppName:python.exe AppVer:0.0.0.0 ModName:umath.pyd ModVer:0.0.0.0 Offset:0002b4bb
  • 它显示像这样telcontar.net/store/archive/CrashGallery/images/crash/a/…但关于python.exe的窗口
  • @mrgloom:不知道。我希望 MemoryError 或可怕的交换。
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多