使用 numpy.save 时出现内存错误

MemoryError when using numpy.save

我正在关注 Sentdex 的 Python 玩 GTA V,他在其中编写代码,使用神经网络在游戏中创建自动驾驶汽车。我试图直接跟随他所做的,但是当收集训练数据的时候,我在保存代码几分钟后不断收到 MemoryError。我设法通过保存到多个文件来收集大量数据,但我想合并这些文件。当我 运行 组合文件的代码时,我在使用 numpy.save 时得到相同的 MemoryError。 我有 16 GB 的 RAM,其中大约 10 个是免费的,总文件大小大约为 500 MB。我正在使用 PyCharm 作为我的 IDE。

保存到多个文件然后合并它们是我最初的解决方案,但它导致了同样的错误。
我试图另存为 HDF5 文件,但出现了不同的错误。老实说,我还没有为此付出太多努力,但如果有必要,我愿意将其用作解决方案。
在下一步平衡之前,我还尝试将数据合并到一个数组中,但它只使用了一个文件(数组是 10,000x5,这是每个文件的大小)。
我在 运行 编译代码时检查了内存使用情况,它在保存时崩溃之前只使用了 523 MB。
我还尝试为保存文件的行设置 allow_pickle=True。

我用它创建了一个包含每个文件中所有数据的数组,它似乎工作正常。

import os
import psutil
import h5py

file_name = 'new_training_data.npy'
new_file = []
file_count = 1

while os.path.isfile(file_name):
    new_data = list(np.load(file_name, allow_pickle=True))
    new_file.append(new_data)

    file_name = 'new_training_data' + str(file_count) + '.npy'
    file_count += 1

我用它来检查内存使用情况。

    # process = psutil.Process(os.getpid())
    # print(process.memory_info().rss)

这条线给我带来了问题。

np.save('appended_training_data.npy', new_file)

这是我尝试另存为 HDF5 文件的地方。

# hf = h5py.File('appended_training_data.h5', 'w')
# hf.create_dataset('dataset_1', data=new_data)
# hf.close()

这是我得到的错误。

Traceback (most recent call last):
  File "C:/Users/Brian/PycharmProjects/PyGTA/Combine _training_data.py", line 19, in <module>
    np.save('appended_training_data.npy', new_file)
  File "<__array_function__ internals>", line 6, in save
  File "C:\Users\Brian\PycharmProjects\PyGTA\venv\lib\site-packages\numpy\lib\npyio.py", line 542, in save
    pickle_kwargs=pickle_kwargs)
  File "C:\Users\Brian\PycharmProjects\PyGTA\venv\lib\site-packages\numpy\lib\format.py", line 659, in write_array
    pickle.dump(array, fp, protocol=3, **pickle_kwargs)
MemoryError

这是我尝试另存为 HDF5 时的错误

Traceback (most recent call last):
  File "C:/Users/Brian/PycharmProjects/PyGTA/Combine _training_data.py", line 23, in <module>
    hf.create_dataset('dataset_1', data=new_data)
  File "C:\Users\Brian\PycharmProjects\PyGTA\venv\lib\site-packages\h5py\_hl\group.py", line 136, in create_dataset
    dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds)
  File "C:\Users\Brian\PycharmProjects\PyGTA\venv\lib\site-packages\h5py\_hl\dataset.py", line 118, in make_new_dset
    tid = h5t.py_create(dtype, logical=1)
  File "h5py\h5t.pyx", line 1634, in h5py.h5t.py_create
  File "h5py\h5t.pyx", line 1656, in h5py.h5t.py_create
  File "h5py\h5t.pyx", line 1711, in h5py.h5t.py_create
TypeError: Object dtype dtype('O') has no native HDF5 equivalent

编辑:我将 while 循环更改为此以具有一致的 np 数据结构

while os.path.isfile(file_name):
    new_data = np.mat(np.load(file_name, allow_pickle=True))

    if len(new_file) == 0:
        new_file = new_data
    else:
        new_file = np.concatenate((new_file, new_data), axis=0)

    file_name = 'new_training_data' + str(file_count) + '.npy'
    file_count += 1

最终编辑:我使用 Spyder 而不是 PyCharm 解决了这个问题。如果有人能阐明它解决问题的原因,我们将不胜感激。

您将所有内容都存储在 python 列表中这一事实对我来说很奇怪。 我会尝试在 np.mat 中连接所有内容,然后用 np 保存它: https://numpy.org/doc/1.17/reference/routines.array-manipulation.html#joining-arrays 不要混合 np 和 python 数据结构,除非你知道你很懒惰。 如果您的 RAM 不超过 500MB,那么大小根本不是问题。 我曾经玩过 Gigs 的数据,numpy 没有膨胀,当 Numpy 试图解压 16+GB 的数据使我的 RAM 过载时,我的内核曾经在 Numpy 报告错误之前崩溃。 祝你好运