我保存了一个 120 GB 的文件(通过二进制格式pickle),其中包含大约 50,000 个(600x600)2d numpy 数组。我需要使用中位数堆叠所有这些数组。最简单的方法是简单地将整个文件作为数组列表读取并使用np.median(arrays, axis=0). 但是,我没有太多的 RAM 可以使用,所以这不是一个好的选择。
因此,我尝试逐个像素地堆叠它们,因为我一次只关注一个像素位置(i, j),然后逐个读取每个数组,将给定位置的值附加到列表中。一旦保存了所有数组中某个位置的所有值,我使用np.median然后只需将该值保存在一个列表中——最终将具有每个像素位置的中值。最后,我可以将其重塑为 600x600,我就完成了。代码如下。
import pickle
import time
import numpy as np
filename = 'images.dat' #contains my 50,000 2D numpy arrays
def stack_by_pixel(i, j):
pixels_at_position = []
with open(filename, 'rb') as f:
while True:
try:
# Gather pixels at a given position
array = pickle.load(f)
pixels_at_position.append(array[i][j])
except EOFError:
break
# Stacking at position (median)
stacked_at_position = np.median(np.array(pixels_at_position))
return stacked_at_position
# Form whole stacked image
stacked = []
for i in range(600):
for j in range(600):
t1 = time.time()
stacked.append(stack_by_pixel(i, j))
t2 = time.time()
print('Done with element %d, %d: %f seconds' % (i, j, (t2-t1)))
stacked_image = np.reshape(stacked, (600,600))
在看到一些时间打印输出后,我意识到这是非常低效的。每次完成一个位置(i, j)大约需要 150 秒左右,这并不奇怪,因为它正在一个一个地读取大约 50,000 个数组。鉴于我的大型阵列中有 360,000(i, j)个位置,预计这需要 22 个月才能完成!显然这是不可行的。但我有点不知所措,因为没有足够的 RAM 可以读取整个文件。或者,也许我可以一次保存数组的所有像素位置(每个位置的单独列表),因为它一个一个地打开它们,但不会在 Python 中保存 360,000 个列表(大约 50,000 个元素长)使用很多RAM 也是?
欢迎任何关于如何在不使用大量 RAM 的情况下显着加快运行速度的建议。谢谢!