Python: 如何在不使用更多 RAM 的情况下将 np 数组/列表拆分为两个数组/列表

Python: How to split np array / list into two arrays / lists without using more RAM

我在拆分 np 时遇到问题。数组和列表一分为二。这是我的代码:

X = []
y = []
for seq, target in ConvertedData:
    X.append(seq)
    y.append(target)

y = np.vstack(y)

train_x = np.array(X)[:int(len(X) * 0.9)]
train_y = y[:int(len(X) * 0.9)]
validation_x = np.array(X)[int(len(X) * 0.9):]
validation_y = y[int(len(X) * 0.9):]

这是为神经网络准备数据的代码示例。效果很好,但会生成 "out of memory error"(我有 32GB 内存):

Traceback (most recent call last):
  File "D:/Projects/....Here is a file location.../FileName.py", line 120, in <module>
    validation_x = np.array(X)[int(len(X) * 0.9):]
MemoryError

它似乎保存在内存列表 X 和 np.array y 中并将其复制为单独的变量 train_x、train_y、validation_x、validation_y。你知道怎么处理吗?

X 的形状:(324000, 256, 24)

y 的形状:(324000,10)

train_x 的形状:(291600, 256, 24)

train_y 的形状:(291600,10)

validation_x 的形状:(32400, 256, 24)

validation_y 的形状:(32400,10)

answer of memory errors. You can pickle each array of trainig data to file like in this question.

所述

您可以按 train_test_split 拆分,这可能是更有效的拆分方式。

import numpy as np
from sklearn.model_selection import train_test_split
X, y = np.arange(10).reshape((5, 2)), range(5)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
X = []
y = []
for seq, target in ConvertedData:
    X.append(seq)
    y.append(target)

Xseq 的列表。我假设那些是数组。 X 只是指向那些,

y = np.vstack(y)

train_x = np.array(X)[:int(len(X) * 0.9)]

X 创建一个数组,然后是该数组的一部分。完整的np.array(X)仍然存在于内存中

train_y = y[:int(len(X) * 0.9)]
validation_x = np.array(X)[int(len(X) * 0.9):]

X 生成另一个数组。 train_xvalidation_x 是单独数组的视图。

validation_y = y[int(len(X) * 0.9):]

正在做

X1 = np.array(X)
train_x = X1[:...]
validation_x = X1[...:]

将消除重复。两者都是同一 X1 的视图。

另一种方法是先对列表进行切片:

train_x = np.array(X[:...])
validation_x = np.array(X[...:])

我的猜测是内存使用,至少在数组中是相似的。

del X 在创建 X1 之后也可能有所帮助,允许 X 和它引用的数组被垃圾收集。

但请注意,一旦您开始在代码中的某一点遇到内存错误,像这样的技巧可能会推迟它。计算很容易最终生成大小相当的副本或临时缓冲区。


您的拆分使用了 2 个切片;这导致视图不会增加原始内存使用。但是如果你进行随机拆分,训练和验证部分将是副本,并且一起占用与源一样多的内存。