сохранение и загрузка большой матрицы - PullRequest
0 голосов
/ 04 ноября 2019

В приведенном ниже коде показано, как сохранить массив NumPy, и после сохранения он составляет около 27 ГБ. Имеется более 200 тыс. Данных изображений, и каждая фигура имеет размер (224 224,3)

hf = h5py.File('cropped data/features_train.h5', 'w')
for i,each in enumerate(features_train):
    hf.create_dataset(str(i), data=each)
hf.close()

. Этот метод используется для загрузки данных, и для его загрузки требуются часы.

features_train = np.zeros(shape=(1,224,224,3))    
hf =  h5py.File('cropped data/features_train.h5', 'r') 
for key in hf.keys():
    x = hf.get(key)
    x = np.array(x)
    features_train = np.append(features_train,np.array([x]),axis=0) 
hf.close()

Итак, у кого-нибудь есть лучшее решение для такого большого размера данных?

1 Ответ

0 голосов
/ 04 ноября 2019

Вы не сказали нам, сколько физической памяти у вашего сервера, но 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()), а затем в цикле назначьте каждый только что прочитанный массив в смещение его предварительно выделенного слота. Линейное время выполнения позволит выполнить задачу намного быстрее.

...