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

问题描述 投票:1回答:2

我有分裂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):]

这是为神经网络准备数据的代码示例。工作得很好,但会产生“内存不足错误”(我的机上有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中,并将其复制为单独的variablest 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)

python numpy matrix out-of-memory
2个回答
1
投票
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片;这会导致视图无法添加到原始内存使用中。但是如果你进行了混乱分割,那么列车和验证部件将是副本,并且一起占用与源相同的内存。


0
投票

正如qazxsw poi中所描述的那样你可以挑选每一组训练数据来归档qazxsw poi

您可以通过answer of memory errors.进行拆分,这可能是执行拆分的更有效方式。

like in this question.
© www.soinside.com 2019 - 2024. All rights reserved.