2013-08-16 1 views
1

Я создаю веб-службу на основе python, которая обеспечивает поддержку обработки естественного языка в нашем основном API приложения. Так как это тяжелая НЛП, для этого требуется разбить несколько очень больших (50-300 МБ) файлов корпуса с диска, прежде чем он сможет делать какие-либо анализы.Кэширование больших объектов в python Флажок/веб-служба Gevent

Как загрузить эти файлы в память, чтобы они были доступны для каждого запроса? Я экспериментировал с memcached и redis, но они, похоже, предназначены для гораздо меньших объектов. Я также пытаюсь использовать объект Flask g, но это сохраняется только в течение одного запроса.

Есть ли способ сделать это при использовании сервера gevent (или другого) для разрешения параллельных соединений? Корпусы полностью доступны только для чтения, поэтому должен быть безопасный способ выставить память на несколько зеленых/потоков/процессов.

Большое спасибо и извините, если это глупый вопрос - я давно работал с python, но я относительно новичок в веб-программировании.

+0

ИМО Вы должны использовать другой формат хранения, чем рассол. Как насчет ... базы данных? –

+0

@MarkusUnterwaditzer yep, я закончил тем, что пошел с redis. Трудность с НЛП заключается в том, что для большинства задач вам нужен весь корпус, загруженный в память, как правило, в какой-то специализированной структуре данных. Если вам нужен только корпус для конкретной задачи, иногда можно обойти это (как я и делал), но я не знаю ни одного хранилища данных, которое бы поддерживало общий случай. – sbrother

ответ

1

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

Хорошим способом инкапсулировать доступ к данным является размещение функций (функций) доступа или классов (ов) в модуле. Вы можете делать разборки данных, когда модуль импортируется, или вы можете запустить эту задачу при первом вызове функции в модуль.

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

+0

Спасибо, это то, что я искал. Не понял, что есть глобальное пространство имен, которое я мог бы использовать. Тем не менее, я закончил с redis и Flask-Cache, выяснив способ разделить файлы корпуса на гораздо более удобоваримые куски. Это очень быстро, и теперь также можно обновлять корпус без простоя. – sbrother

0

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