Python: Как разделить массив / список np на два массива / списка без использования дополнительной оперативной памяти - PullRequest
1 голос
/ 05 апреля 2019

У меня проблема с расщеплением 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):]

Это пример кода, который подготавливает данные для нейронной сети. Прекрасно работает, но генерирует «нехватку памяти» (у меня на борту 32 ГБ):

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)

Форма поезда_x: (291600, 256, 24)

Форма поезда_y: (291600,10)

Форма проверки_x: (32400, 256, 24)

Форма проверки_y: (32400,10)

Ответы [ 2 ]

1 голос
/ 05 апреля 2019
X = []
y = []
for seq, target in ConvertedData:
    X.append(seq)
    y.append(target)

X - это список seq.Я предполагаю, что это массивы.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_x и validation_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 голосов
/ 05 апреля 2019

Как описано в ответе ошибок памяти. Вы можете выбрать каждый массив данных обучения в файл , как в этом вопросе.

Вы можете разделить на 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)
...