Python: база данных объектов в памяти, которая поддерживает индексацию?

При установке сервера JBoss с помощью Eclipse WebTools можно просто запустить сервер в режиме отладки (кнопка отладки в представлении серверов). Это позволит Вам устанавливать точки останова в приложении, которое работает в JBoss.

26
задан tmthydvnprt 28 July 2016 в 05:12
поделиться

5 ответов

Если решение для работы с базой данных в памяти оказывается слишком трудоемким, вот метод для его фильтрации, который может оказаться полезным.

Функция get_filter принимает аргументы, чтобы определить, как вы хотите фильтровать словарь, и возвращает функцию, которую можно передать во встроенную функцию filter для фильтрации списка словарей.

import operator

def get_filter(key, op=None, comp=None, inverse=False):
    # This will invert the boolean returned by the function 'op' if 'inverse == True'
    result = lambda x: not x if inverse else x
    if op is None:
        # Without any function, just see if the key is in the dictionary
        return lambda d: result(key in d)

    if comp is None:
        # If 'comp' is None, assume the function takes one argument
        return lambda d: result(op(d[key])) if key in d else False

    # Use 'comp' as the second argument to the function provided
    return lambda d: result(op(d[key], comp)) if key in d else False

people = [{'age': 16, 'name': 'Joe'}, {'name': 'Jane', 'favourite_color': 'red'}]

print filter(get_filter("age", operator.gt, 15), people)
# [{'age': 16, 'name': 'Joe'}]
print filter(get_filter("name", operator.eq, "Jane"), people)
# [{'name': 'Jane', 'favourite_color': 'red'}]
print filter(get_filter("favourite_color", inverse=True), people)
# [{'age': 16, 'name': 'Joe'}]

Это довольно легко расширяемо для более сложной фильтрации, например, для фильтрации на основе того, соответствует ли значение регулярному выражению:

p = re.compile("[aeiou]{2}") # matches two lowercase vowels in a row
print filter(get_filter("name", p.search), people)
# [{'age': 16, 'name': 'Joe'}]
5
ответ дан 28 November 2019 в 07:55
поделиться

Что касается «идентичности» всего, что можно хэшировать, вы должны иметь возможность сравнивать, чтобы отслеживать идентичность объекта.

База данных объектов Zope (ZODB): http://www.zodb.org/

PyTables работает хорошо: http://www.pytables.org/moin

Также хорошо работает Metakit для Python: http://equi4.com/metakit/python.html
supports columns, and sub-columns but not unstructured data

Изучите «Потоковую обработку», если ваши наборы данных очень велики, это может быть полезно: http://www.trinhhaianh.com/stream.py/

Любая база данных в памяти, которые могут быть сериализованы (записаны на диск), будут иметь проблемы с идентификацией. Я бы предложил представлять данные, которые вы хотите сохранить, как нативные типы (list, dict) вместо объектов, если это вообще возможно.

Имейте в виду, что NumPy был разработан для выполнения сложных операций со структурами данных в памяти и мог бы быть частью вашего решения, если вы решите свернуть свое собственное.

3
ответ дан 28 November 2019 в 07:55
поделиться

Если вы хотите обойти сериализацию, MongoDB может работать на вас. PyMongo предоставляет интерфейс, почти идентичный тому, что вы описываете. Если вы решите сериализоваться, попадание не будет таким плохим, поскольку Mongodb отображен в памяти.

0
ответ дан 28 November 2019 в 07:55
поделиться

Не уверен, что он соответствует всем вашим требованиям, но TinyDB (с использованием памяти в памяти) также, вероятно, стоит попробовать:

>>> from tinydb import TinyDB, Query
>>> from tinydb.storages import MemoryStorage
>>> db = TinyDB(storage=MemoryStorage)
>>> db.insert({'name': 'John', 'age': 22})
>>> User = Query()
>>> db.search(User.name == 'John')
[{'name': 'John', 'age': 22}]

Его простота и мощная система запросов делают его очень интересным инструментом. для некоторых случаев использования. См. http://tinydb.readthedocs.io/ для получения более подробной информации.

0
ответ дан 28 November 2019 в 07:55
поделиться

Я начал разрабатывать один вчера, и он еще не опубликован. Он индексирует ваши объекты и позволяет выполнять быстрые запросы. Все данные хранятся в оперативной памяти, и я думаю об умных методах загрузки и сохранения. Для тестирования это загрузка и сохранение через cPickle.

Дайте мне знать, если вы все еще заинтересованы.

0
ответ дан 28 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: