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 среза;это приводит к представлениям, которые не добавляют к оригинальному использованию памяти.Но если вы сделаете случайное разделение, части поезда и проверки будут копиями и вместе будут занимать столько же памяти, сколько и источник.