Моему приложению Python High Replication Datastore требуется большая таблица поиска от 100 000 до 1 000 000 записей. Мне нужно иметь возможность предоставить код некоторому методу, который будет возвращать значение, связанное с этим кодом (или None, если нет связи). Например, если моя таблица содержит приемлемые английские слова, я бы хотел, чтобы функция возвращала True, если слово было найдено, и False (или None) в противном случае.
Моя текущая реализация состоит в том, чтобы создать один объект без родителей для каждой записи таблицы, и чтобы этот объект содержал любые связанные данные. Я установил ключ хранилища данных для этой сущности так же, как мой код поиска. (Я поместил все сущности в их собственное пространство имен, чтобы предотвратить любые конфликты клавиш, но это не существенно для этого вопроса.) Затем я просто вызываю get_by_key_name () для кода и получаю связанные данные.
Проблема в том, что я не могу получить доступ к этим объектам во время транзакции, потому что я пытаюсь охватить группы объектов. Итак, возвращаясь к моему примеру, скажем, я хотел проверить правописание всех слов, используемых в сеансе чата. Я мог получить доступ ко всем сообщениям в чате, потому что я дал им общего предка, но я не мог получить доступ к своей таблице слов, потому что записи там не содержат родителей. Крайне важно, чтобы я мог ссылаться на таблицу во время транзакций.
Обратите внимание, что моя таблица поиска исправлена или изменяется очень редко. Опять же, это соответствует примеру проверки орфографии.
Одним из решений может быть загрузка всех слов в сеансе чата во время одной транзакции, затем проверка их правописания (сохранение результатов), а затем начало второй транзакции, которая будет проверять орфографию сохраненных результатов. Но это не только неэффективно, но и между транзакциями может быть добавлен сеанс чата. Это похоже на неуклюжее решение.
В идеале я хотел бы сказать GAE, что таблица поиска является неизменной, и что из-за этого я должен иметь возможность запрашивать ее, не жалуясь на охват групп объектов в транзакции. Однако я не вижу способа сделать это.
Хранение записей таблицы в memcache заманчиво, но с этим тоже есть проблемы. Это большой объем данных, но более проблематичным является то, что если GAE загрузит запись memcache, я не смогу перезагрузить ее во время транзакции.
Кто-нибудь знает подходящую реализацию для больших глобальных таблиц поиска?
Пожалуйста, поймите, что я не ищу веб-сервис для проверки орфографии или что-то подобное. Я использую поиск слов в качестве примера, только чтобы прояснить этот вопрос, и я надеюсь на общее решение для любого вида больших таблиц поиска.