Как я могу использовать модуль Python io для построения резидентной структуры данных?
Я пытаюсь записать данные, собранные из системы сбора данных, в места в памяти, а затем асинхронно выполнить дальнейшую обработку данных или записать их в файл для автономной обработки. Я пытаюсь сделать эту архитектуру таким образом, чтобы изолировать получение данных от анализа и передачи данных, что дает нам некоторую гибкость для будущего расширения и улучшения, но это, безусловно, более сложно, чем просто запись данных непосредственно в файл.
Вот некоторый исследовательский код, который я написал.
#io.BufferedRWPair test
from io import BufferedRWPair
# Samples of instrumentation data to be stored in RAM
test0 = {'Wed Aug 1 16:48:51 2012': ['20.0000', '0.0000', '13.5', '75.62', '8190',
'1640', '240', '-13', '79.40']}
test1 = {'Wed Aug 1 17:06:48 2012': ['20.0000', '0.0000', '13.5', '75.62', '8190',
'1640', '240', '-13', '79.40']}
# Attempt to create a RAM-resident object into which to read the data.
data = BufferedRWPair(' ', ' ', buffer_size=1024)
data.write(test0)
data.write(test1)
print data.getvalue()
data.close()
Здесь есть несколько проблем (может быть, больше!):
-> 'data' - это имя переменной, которая выбирает конструкцию (вне Python), которую я пытаюсь собрать - это массивоподобная структура, которая должна содержать последовательные записи с каждой записью, содержащей несколько измерений данных процесса, с предисловием меткой времени, которая может служить ключом для поиска. Я предложил это в качестве фона для моего замысла в разработке, на случай, если код был слишком расплывчатым, чтобы отражать мои настоящие вопросы.
-> Этот код не работает, потому что объект 'data' не создается. Я просто пытаюсь открыть пустой буфер, который будет заполнен позже, но Python ищет два объекта, один для чтения, другой для записи, которых нет в моем коде. Из-за этого я не уверен, что даже использую правильную конструкцию, которая приводит к следующим вопросам:
Является ли io.BufferedRWPair лучшим способом для обработки этих данных? Я пробовал StringIO, так как я на Python 2.7.2, но не повезло. Мне нравится идея записи с ключом временной метки, отсюда мой выбор структуры dict, но я обязательно посмотрю на альтернативы. Есть ли другие классы io, на которые я должен смотреть вместо этого?
Одна альтернатива, которую я рассмотрел, - это конструкция DataFrame, которая определена в мире NumPy/ SciPy/ Pandas. Это выглядит интересно, но кажется, что требуется много дополнительных модулей, так что я от этого уклонялся. У меня нет опыта работы с этими модулями. Нужно ли мне смотреть на эти более сложные модули, чтобы получить то, что мне нужно?
Я приветствую любые предложения или отзывы, ребята... Спасибо за проверку этого вопроса!
2 ответа
Если я понимаю, что вы спрашиваете, использование базы данных sqlite в памяти может быть правильным способом. Sqlite позволяет вам создавать полностью функционирующую базу данных SQL полностью в памяти. Вместо чтения и записи вы должны делать выборки и вставки.
Запись механизма для хранения данных в памяти, когда они умещаются, и запись их в файл только при необходимости, является избыточной - операционная система все равно сделает это за вас. Если вы используете обычный файл и обращаетесь к нему из разных частей вашего приложения, операционная система будет хранить содержимое файла в кеше диска, пока доступно достаточно памяти.
Если вы хотите иметь доступ к файлу по адресам памяти, вы можете отобразить его в памяти, используя mmap
модуль. Однако у меня сложилось впечатление, что все, что вам нужно, - это стандартная база данных или одна из более простых альтернатив, предлагаемых стандартной библиотекой Python, например, shelve
любой anydbm
модули.
На основе ваших комментариев, также проверьте магазины значения ключа, такие как Redis
а также memcached
,