При установке сервера JBoss с помощью Eclipse WebTools можно просто запустить сервер в режиме отладки (кнопка отладки в представлении серверов). Это позволит Вам устанавливать точки останова в приложении, которое работает в JBoss.
Если решение для работы с базой данных в памяти оказывается слишком трудоемким, вот метод для его фильтрации, который может оказаться полезным.
Функция 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'}]
Что касается «идентичности» всего, что можно хэшировать, вы должны иметь возможность сравнивать, чтобы отслеживать идентичность объекта.
База данных объектов 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 был разработан для выполнения сложных операций со структурами данных в памяти и мог бы быть частью вашего решения, если вы решите свернуть свое собственное.
Если вы хотите обойти сериализацию, MongoDB может работать на вас. PyMongo предоставляет интерфейс, почти идентичный тому, что вы описываете. Если вы решите сериализоваться, попадание не будет таким плохим, поскольку Mongodb отображен в памяти.
Не уверен, что он соответствует всем вашим требованиям, но 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/ для получения более подробной информации.
Я начал разрабатывать один вчера, и он еще не опубликован. Он индексирует ваши объекты и позволяет выполнять быстрые запросы. Все данные хранятся в оперативной памяти, и я думаю об умных методах загрузки и сохранения. Для тестирования это загрузка и сохранение через cPickle.
Дайте мне знать, если вы все еще заинтересованы.