Сохранение данных постепенно с помощью Python - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над проектом, в котором генерируется много данных. Я хочу, чтобы мои данные сохранялись на ходу, чтобы мне не приходилось хранить все это в оперативной памяти. В настоящее время я использую Numpy, чтобы сохранить все в файл NPZ, когда программа заканчивается. Вещи, которые нужно сохранить, это скаляры, список и список списков. В списки добавляются значения постепенно, и поэтому мне нужен способ добавить их в каждый список, не загружая все в память.

Я все еще немного новичок в Python, поэтому, если есть стандартный способ сделать это, пожалуйста, укажите мне в этом направлении.

Спасибо

1 Ответ

0 голосов
/ 04 июля 2018

PyTables - это дружественный пакет numpy, предназначенный для вывода данных на диск для работы с наборами данных, которые не помещаются в памяти.

См .: https://www.pytables.org/usersguide/tutorials.html

https://kastnerkyle.github.io/posts/using-pytables-for-larger-than-ram-data-processing/

Использование

# Create a data-frame description (called a table)
# each attribute of Particle below is a column.
from tables import *
class Particle(IsDescription):
    name      = StringCol(16)   # 16-character String
    idnumber  = Int64Col()      # Signed 64-bit integer
    ADCcount  = UInt16Col()     # Unsigned short integer
    TDCcount  = UInt8Col()      # unsigned byte
    grid_i    = Int32Col()      # 32-bit integer
    grid_j    = Int32Col()      # 32-bit integer
    pressure  = Float32Col()    # float  (single-precision)
    energy    = Float64Col()    # double (double-precision)

# create a hdf5 file on disk to store data in
h5file = open_file("tutorial1.h5", mode="w", title="Test file")

# create a table within the file, using the Particle description class
table = h5file.create_table(group, 'readout', Particle, "Readout example")

Производительность

Это особенно полезно для вычислений по многим строкам данных.

PyTables поддерживает Blosc (это хитрый трюк)

Вы можете выполнять запросы "in kernal", используя blosc с помощью метода where.

result = [row['col2'] for row in table.where(
            '''(((col4 >= lim1) & (col4 < lim2)) |
               ((col2 > lim3) & (col2 < lim4)) &
               ((col1+3.1*col2+col3*col4) > lim5))''')]

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...