Вы не сказали нам, сколько физической памяти у вашего сервера, но 27 ГиБ звучат как "много". Подумайте о том, чтобы разбить ваш пробег на несколько меньших партий.
В земле java есть старая пила, которая спрашивает: «Почему у нее квадратичное время выполнения?», То есть «почему это так медленно?»
String s = ""
for (int i = 0; i < 1e6, i++) {
s += "x";
}
Ответ заключается в том, что в конце каждой итерации мы читаем ~ миллион символов, затем пишем их, затем добавляем один символ. Стоимость O (1e12). Стандартное решение - использовать StringBuilder, чтобы мы вернулись к ожидаемому O (1e6).
Здесь я беспокоюсь, что вызов np.append()
толкает нас в квадратичный режим.
Для проверкизамените присвоение features_train
простой оценкой np.array([x])
, чтобы мы потратили немного времени на вычисления, а затем сразу отбрасывали это значение на каждой итерации. Если гипотеза верна, время выполнения будет намного меньше.
Чтобы исправить это, избегайте вызова .append()
. Вместо этого предварительно выделите 27 ГиБ с помощью np.zeros()
(или np.empty()
), а затем в цикле назначьте каждый только что прочитанный массив в смещение его предварительно выделенного слота. Линейное время выполнения позволит выполнить задачу намного быстрее.