У меня есть большая структура данных только для чтения (график, загруженный в networkx, хотя это не должно быть важно), который я использую в своей веб-службе. Вебсервис построен в Flask, а затем подается через Gunicorn. Оказывается, для каждого рабочего-стрелялка я раскручиваюсь, у него работает собственная копия моей структуры данных. Таким образом, моя структура данных размером ~ 700 Мб, которая отлично управляема с одним рабочим, превращается в довольно крупную память, когда у меня есть 8 из них. Есть ли способ поделиться этой структурой данных между процессами пушки, так что мне не нужно тратить столько памяти?Обмен памятью в Гуйкенкорне?
ответ
Похоже, что самый простой способ сделать это - tell gunicorn to preload your application с использованием опции preload_app
. Это предполагает, что вы можете загрузить структуру данных в качестве переменного уровня модуля:
from flask import Flask
from your.application import CustomDataStructure
CUSTOM_DATA_STRUCTURE = CustomDataStructure('/data/lives/here')
# @app.routes, etc.
В качестве альтернативы, вы можете использовать memory-mapped file (если вы можете обернуть разделяемую память с пользовательской структурой данных), gevent with gunicorn для того, чтобы вас используйте только один процесс или the multi-processing module to spin up your own data-structure server, с которым вы подключаетесь к IPC.
параметр предварительной загрузки не работает, можете ли вы привести пример использования его с некоторой фиктивной структурой данных? – neel
@neel - вам, вероятно, лучше задавать другой вопрос с примером вашей установки и тем, что не работает. –
Я разместил вопрос здесь http://stackoverflow.com/questions/35914587/how-to-get-a-concurreny-of-1000-requests-with-flask-and-gunicorn Было бы здорово, если бы вы посмотрели у него один раз. Заранее спасибо. – neel
- 1. Обмен памятью C - Производительность
- 2. Обмен памятью RDMA
- 3. Обмен памятью между модулями
- 4. Обмен памятью через две программы
- 5. Обмен памятью постоянных структур данных в clojure
- 6. Обмен памятью между приложением и драйвером
- 7. Обмен памятью между двумя процессами (C, Windows)
- 8. Обмен памятью между двумя родными приложениями
- 9. Обмен памятью между CGImageRef и UIImage
- 10. Возможно ли обмен памятью между PHP и C в Windows?
- 11. Обмен памятью между пользовательским пространством и пространством ядра
- 12. Обмен глобальной памятью GlobalAlloc() от DLL к нескольким приложениям Win32
- 13. Обмен памятью между файлами YACC, Lex и C
- 14. Возможно ли обмен памятью между ruby и C++
- 15. Обмен памятью; Наследование; Базовые и производные экземпляры; C++
- 16. Обмен списком в OCaml
- 17. Обмен памятью из ядра linux в пользовательское пространство в однопользовательском режиме
- 18. Обмен и обмен между клиентами в Magento
- 19. Обмен данными через ViewControllers
- 20. Управление памятью с флэш-памятью
- 21. Обмен памятью между родительским и дочерним процессом в Solaris (in C)
- 22. Java - обнаружение обмена памятью во время выполнения
- 23. Управление памятью для приложений с интенсивной памятью
- 24. Управление памятью и памятью с помощью pcap
- 25. Блок управления виртуальной памятью и памятью
- 26. Проблемы с памятью и памятью с R
- 27. Управление памятью в AngularJS
- 28. Управление памятью в gcc
- 29. Управление памятью в zf2
- 30. Управление памятью в NodeJs
Вы считали, что используете что-то вроде Redis для хранения данных и доступа к ним из каждого процесса? Было бы очень похоже на разделяемую память, насколько скорость идет. – nathancahill
Я бы сказал, но мы говорим о сложном графе, что нет простого способа сохранить в Redis (у Redis нет ориентированных граничных графов или общей поддержки графика в настоящее время AFAIK). – Eli
Решено ли решение для вас? Если да, вы можете подробно рассказать мне, как вы это сделали? – neel