Python: правильный способ чтения большого набора данных без сбоя памяти - PullRequest
0 голосов
/ 02 мая 2018

Я прочитал набор двоичных данных TDMS, сгенерированный LabView, используя этот код . Размер файла составляет около 500 МБ, поэтому он не такой большой, как прокомментированный в других опубликованных вопросах, например Q1 и Q2 .

Мой компьютер имеет четырехъядерный процессор i7 и 8 ГБ оперативной памяти, использует Ubuntu 16.04 и запускает IPython Notebook (Python 2.7).

Я заметил, что в системе мониторинга каждый раз, когда я читаю файл (~ 500 МБ), он, очевидно, хранится в оперативной памяти. Данные имеют 8 массивов по 3.3e7 точек. Когда я попытался построить (используя matplotlib) только один массив, потребление памяти увеличилось примерно до 1 ГБ. Итак, представьте, когда я попытался построить 8 массивов на одном графике. Я должен перезагрузить ядро, чтобы очистить память ОЗУ. Но что, если мне нужно построить каждый массив?

Я экспериментировал с этим раньше, когда читал кратные астрономические изображения.

Я пытался найти ответ для этих ищущих в вопросах Q1 и Q2 , но эти ответы не решены.

Итак, вопрос: как я могу управлять памятью для больших наборов данных, используя python?

Пример кода:

%matplotlib nbagg 
import matplotlib.pyplot as plt
import numpy as np
from nptdms import TdmsFile

tdms_file = TdmsFile("20180320_190351_060_PXI-5105.tdms")
root_object = tdms_file.object()

# Iterate over all items in the properties dictionary and print them
for name, value in root_object.properties.items():
    print("{0}: {1}".format(name, value))

Timestamp: 2018-03-20 19:03:51.060532343
Digitizer: PXI-5105
SamplingRate: 30000000
PreTrigger: 0.05
PostTrigger: 1.05
TriggerSource: 4
TriggerHigh: 0.95
TriggerLow: -0.95
Offset: 447.0
Longitude: -46.7273776
Latitude: -23.4832443
GPS-Status: self survey not completed

tdms_groups = tdms_file.groups()
print tdms_groups
[u'PXI-5105-Ch0',
 u'PXI-5105-Ch1',
 u'PXI-5105-Ch2',
 u'PXI-5105-Ch3',
 u'PXI-5105-Ch4',
 u'PXI-5105-Ch5',
 u'PXI-5105-Ch6']

dms_Variables_0 = tdms_file.group_channels("PXI-5105-Ch0")
dms_Variables_1 = tdms_file.group_channels("PXI-5105-Ch1")
dms_Variables_2 = tdms_file.group_channels("PXI-5105-Ch2")
dms_Variables_3 = tdms_file.group_channels("PXI-5105-Ch3")
dms_Variables_4 = tdms_file.group_channels("PXI-5105-Ch4")
dms_Variables_5 = tdms_file.group_channels("PXI-5105-Ch5")
dms_Variables_6 = tdms_file.group_channels("PXI-5105-Ch6")

MessageData_channel_0 = tdms_file.object('PXI-5105-Ch0', 'Frame_1')
MessageData_channel_1 = tdms_file.object('PXI-5105-Ch1', 'Frame_1')
MessageData_channel_2 = tdms_file.object('PXI-5105-Ch2', 'Frame_1')
MessageData_channel_3 = tdms_file.object('PXI-5105-Ch3', 'Frame_1')
MessageData_channel_4 = tdms_file.object('PXI-5105-Ch4', 'Frame_1')
MessageData_channel_5 = tdms_file.object('PXI-5105-Ch5', 'Frame_1')
MessageData_channel_6 = tdms_file.object('PXI-5105-Ch6', 'Frame_1')


# Here the data arrays
MessageData_data_0 = np.array(MessageData_channel_0.data)
MessageData_data_1 = np.array(MessageData_channel_1.data)
MessageData_data_2 = np.array(MessageData_channel_2.data)
MessageData_data_3 = np.array(MessageData_channel_3.data)
MessageData_data_4 = np.array(MessageData_channel_4.data)
MessageData_data_5 = np.array(MessageData_channel_5.data)
MessageData_data_6 = np.array(MessageData_channel_6.data)


# Plot
fig, ax = plt.subplots()
ax.plot(MessageData_data_1)
...