Python 如何在创建3000+;的numpy数组时减少内存使用;jpegs蟒蛇3

Python 如何在创建3000+;的numpy数组时减少内存使用;jpegs蟒蛇3,python,arrays,numpy,out-of-memory,Python,Arrays,Numpy,Out Of Memory,我正在尝试将3000多个JPEG批量转换为numpy数组进行处理。 我在MacBook Pro 2016型号上运行此功能,该型号具有8 GB的RAM。 在我的程序将大约2800个JPEG转换成numpy数组并将其附加到我的img列表后,我的计算机会给我一个关于达到最大内存限制的警告,我必须强制退出python,因为它没有响应 我的代码如下: root_dir = '/Users/JohnDoe/Desktop/data' imgs = [] labels = [] all_img_paths

我正在尝试将3000多个JPEG批量转换为numpy数组进行处理。 我在MacBook Pro 2016型号上运行此功能,该型号具有8 GB的RAM。 在我的程序将大约2800个JPEG转换成numpy数组并将其附加到我的img列表后,我的计算机会给我一个关于达到最大内存限制的警告,我必须强制退出python,因为它没有响应

我的代码如下:

root_dir = '/Users/JohnDoe/Desktop/data'
imgs = []
labels = []

all_img_paths = glob.glob(os.path.join(root_dir, '*/*.jpg'))
np.random.shuffle(all_img_paths)
count = 0
for img_path in all_img_paths:
    count += 1
    img = io.imread(img_path)
    label = get_class(img_path)
    imgs.append(img)
    labels.append(label)

X = np.array(imgs, dtype='float32')
# Make one hot targets
Y = np.eye(2, dtype='uint8')[labels]

如何减少此程序所需的内存量,并使其仅使用8GB的RAM运行?

为什么需要3k jpg阵列?你能把它分成几块吗?一次处理500个左右。对我来说,这似乎是最简单的方法,但可能无法处理您尝试执行的操作。如果您的颜色深度为8位,则可以确保您的图像存储为
numpy.uint8
数组。否则就没有那么多事情可做了。你真的需要一次阅读全部3000张图片吗。难道不可能把它分成几百张图片的块吗?最终,我需要将所有的块重新组合成一个数组,这样我就可以将它转换成keras的一个热门目标。如何确保图像存储为numpy.uint8数组?好的,我有一个解决问题的方法,我可以预先分配一个大小为n的numpy数组,然后在创建它们时设置数组的值。这样,计算机就不必在RAM中找到新的位置来放置numpy阵列,也不必交换内存。如果块上的内存不足,那么整个阵列上的内存肯定会不足。您可以使用
np.memmap
并将阵列保留在磁盘上,但如果需要对整个阵列进行计算,您仍然需要将其放入RAM中。不知怎么的,你不能分块处理?为什么你需要一个3k jpg的数组?你能把它分成几块吗?一次处理500个左右。对我来说,这似乎是最简单的方法,但可能无法处理您尝试执行的操作。如果您的颜色深度为8位,则可以确保您的图像存储为
numpy.uint8
数组。否则就没有那么多事情可做了。你真的需要一次阅读全部3000张图片吗。难道不可能把它分成几百张图片的块吗?最终,我需要将所有的块重新组合成一个数组,这样我就可以将它转换成keras的一个热门目标。如何确保图像存储为numpy.uint8数组?好的,我有一个解决问题的方法,我可以预先分配一个大小为n的numpy数组,然后在创建它们时设置数组的值。这样,计算机就不必在RAM中找到新的位置来放置numpy阵列,也不必交换内存。如果块上的内存不足,那么整个阵列上的内存肯定会不足。您可以使用
np.memmap
并将阵列保留在磁盘上,但如果需要对整个阵列进行计算,您仍然需要将其放入RAM中。你怎么就不能分块处理?