在处理非常大的三维直方图时,如何处理function_base.py模块中的MemoryError?

时间:2018-04-04 21:09:22

标签: python-3.x memory out-of-memory reshape large-data

有一个三维球体,里面填充了许多以球体内某种特定方式分布的粒子。这个球体被分成一个已知和固定大小的非常小的立方体,这样这些网格的边对应于 x y z 系统的轴。由于所有组成粒子的位置和质量是已知的,因此可以建立表示球体内粒子分布的3d直方图。一些立方体包含许多这样的粒子,通过在每个立方体内添加所有粒子而产生一些有限质量。

可以通过以下方式计算沿投影尺寸的最大局部密度:(i)定义3d直方图函数,然后(ii)通过将总质量除以每个立方网格的体积将其转换为3d密度,最后(iii)找到沿着上述投影的最大直方图阵列。这是python代码:

import numpy as np

dimensions_plot = [0,1,2] #where 0 stands for x, 1 for y, and 2 for z

# calculate maximum local density along projected dimension
hist_values, (hist_xs, hist_ys, hist_zs) = np.histogramdd(positions, position_bin_number, position_limits, weights=weights, normed=False,)

# convert to 3-d density
hist_values /= (np.diff(hist_xs)[0] * np.diff(hist_ys)[0] * np.diff(hist_zs)[0])

dimension_project = np.setdiff1d([0, 1, 2], dimensions_plot)

hist_values = np.max(hist_values, dimension_project)

这是我在计算整个球体的三维直方图时收到的错误信息:

Traceback (most recent call last):
  File "/some/path/to/the/my_code.py", line 6, in np.histogramdd()
    positions, position_bin_number, position_limits, weights=weights, normed=False,

  File "/usr/local/anaconda3/lib/python3.5/site-packages/numpy/lib/function_base.py", line 977, in histogramdd
    hist = zeros(nbin, float).reshape(-1)
MemoryError

根据以下帖子(How to deal with “MemoryError” in Python code),结论是有某些事情可以获救或者可以恢复翻译。由于每个轴上有大约3,000个网格,所以当这个数字为立方体时,它变得足够大,以便阵列的大小变得足够大。增加网格大小后,我注意到代码似乎永远在运行。

我确实需要更小的网格尺寸。无论如何加速代码而不管网格的大小?我可以绕过此错误消息,同时确保我的结果至少为float32个数字吗?

非常感谢您的帮助。

0 个答案:

没有答案