2015-09-14 2 views
3

У меня возникли проблемы с разработкой того, как подойти к моей конкретной проблеме (возможно, из-за слишком большого количества параметров!) В отношении хранения простых данных временных рядов с использованием python ,Простой (но большой) чтение/запись данных временных рядов в python

Все, что я хочу сделать, это сохранить и получить доступ к действительно длинному одномерному списку из 16-битных целых чисел. Я даже не обязательно должен хранить индекс, поскольку он может быть неявно получен из порядка выборок. Но мне нужна быстрая операция добавления.

Проблема заключается в том, что я ожидаю, чтобы иметь о 100GB данных, которая должна быть записана на диск на лету в 100M семплов/сек (я проверил и моя установка SSD может работать 400-500MB/сек пишет), и только с ~ 14 ГБ ОЗУ. Моя первоначальная идея состояла в том, чтобы в основном записать его в отдельные CSV-файлы в кусках строк 100M, но похоже, что это отнимает много места (16-битное целое число может принимать до 5 байтов в виде строки вместо 2). Другие идеи включали использование msgpack/npz/raw двоичных файлов для кусков, и, хотя я более чем счастлив реализовать это самостоятельно, я пытаюсь работать, если есть решение, которое уже существует.

Поскольку я не знаю точно количество образцов, которые мне нужны заранее, я думаю, это означает, что memmap numpy не подходит.

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

Я думаю, что pandas HDFStore - это то, что мне нужно, но я не уверен в некоторых из лучших практик.

В частности,

  1. Учитывая очень простой формат данных, каковы последствия большого количества узлов (один узел на куске) против одного узла с использованием HDFStore в панд? Если первое лучше, что будет хорошего размера куска?
  2. Являются ли HDFStores лучшим способом для чтения и записи с высокой скоростью последовательного чтения и записи в pandas? Случайный доступ не имеет значения.
  3. Является ли моя проблема в области панд? В этой ситуации панды кажутся мне излишними.

Любые другие рекомендации или рекомендации будут оценены. Действительно, мне нужен объект списка в python, но он также поддерживает быстрый доступ к диску и с диска.

+0

Является ли 100 ГБ данных, сгенерированных на лету или уже сохраненных? – sihrc

+0

Почему бы вам не использовать библиотеку HDF5 напрямую и разделить файл позже? Не похоже, что Панда дает вам какую-то пользу. – ganduG

+0

@sihrc: Он генерируется на лету от некоторых аппаратных средств. – jeremy

ответ

4

Лондонская группа для моей фирмы, созданная арктической. Он использует массивы numpy byte, сжатые с lz4 и разбитые на куски для отправки в mongodb. В Бостоне мы создаем другие функции вокруг этого, но мы находим, что он отлично работает.

У этого есть отличная производительность для того, чтобы вырвать всю вещь сразу.

https://github.com/manahl/arctic

Посмотрите и посмотреть, если он может работать для вас.

1

Вы также можете использовать только один необработанный двоичный файл. Если вы пишете данные в кусках, это должно иметь очень небольшие накладные расходы. После сбора данных вы можете memmap файл и отрезать.Пример с Numpy массивами:

import numpy as np 

CHUNKSIZE = 2**24 # Requires tuning 

def get_chunks_from_somewhere(n): 
    """Generate dummy data.""" 
    for _ in range(n): 
     yield np.random.randint(2**16, size=CHUNKSIZE).astype(np.uint16) 

with open('temp.dat', 'wb') as fih: 
    for chunk in get_chunks_from_somewhere(100): 
     chunk.tofile(fih) 

Независимо от формата файла, реальная проблема, я думаю, что вы должны писать на диск асинхронно, в противном случае он может блокировать чтение из прибора (?).

Смежные вопросы