Память используется numpy массивов больше, чем RAM? - PullRequest
0 голосов
/ 23 апреля 2020

Я прочитал очень большие файлы tdms, содержащие данные датчиков, в списки массивов numpy. Структура следующая: данные из нескольких файлов хранятся в экземплярах объекта с именем file_data. У объекта есть свойства для каждого типа датчика, которые в основном представляют собой списки numpy массивов (по одному для каждого отдельного датчика этого типа датчика).

Я хотел знать, сколько данных я храню здесь (так как размер файлы tdms, сгенерированные Labview, казались не очень значимыми со всеми метаданными).

Это код:

# Check memory
total = 0
file_data = [file_data1, file_data2, ...] # list of data objects read from six files
for no, f in enumerate(file_data):
    sensor_types = [f.sensortype1, f.sensortype2, ...] # list of sensor types
    sum = 0
    for sensor_type in sensor_types: # list
        for data in sensor_type: #np.array
            sum += (data.size * data.itemsize)
    total += sum
    print('Data from file {}, size: {:.2f} GB'.format(no+1, sum/(1024**3))) 
print('Total memory: {:.2f} GB'.format(total/(1024**3)))

Теперь это дает мне следующий вывод:

Данные из файла 1, размер: 2,21 ГБ

Данные из файла 2, размер: 1,88 ГБ

Данные из файла 3, размер: 2,27 ГБ

Данные из файла 4, размер: 1,53 ГБ

Данные из файла 5, размер: 1,01 ГБ

Данные из файла 6, размер: 0,66 ГБ

Общий объем памяти: 9,56 ГБ

Но я работаю на 8 ГБ ОЗУ Ма c, так что это число меня очень удивило, так как программа не взломала sh и я могу работать с данные. Где я ошибаюсь?

1 Ответ

0 голосов
/ 28 апреля 2020

Полагаю, вы используете npTDMS .

Используемый тип numpy.array - это не просто массив, в котором все элементы массива всегда хранятся в памяти. Хотя тип данных и количество элементов известны (в данном случае путем чтения метаданных из файла TDMS), элементы не считываются до тех пор, пока не будет запрошено.

То есть: если вам нужен последний элемент записи размером 20 ГБ, npTDMS знает, где он хранится в файле, читает и возвращает его - без чтения первых 20 ГБ.

...