Я разрабатываю утилиту командной строки Python, которая потенциально включает в себя довольно большие запросы к набору файлов. Это достаточно конечный список запросов (подумайте об индексированных столбцах БД). Чтобы повысить производительность в процессе, я могу создать отсортированные/структурированные списки, карты и деревьяодин раз и обращаться к ним повторно, вместо того, чтобы каждый раз обращаться к файловой системе. время.
Однако эти кэши теряются, когда процесс завершается, и их необходимо перестраивать каждый раз при запуске скрипта, что значительно увеличивает время выполнения моей программы. Я хотел бы определить лучший способ обмена этими данными между несколькими выполнениями моей команды, которые могут выполняться одновременно, одно за другим или со значительными задержками между выполнениями.
Требования:
Предпочтения:
В моем идеальном фантастическом мире я мог бы напрямую хранить объекты Python между выполнениями, что-то вроде потоков Java (например, запросов Tomcat), разделяющих одноэлементные объекты хранилища данных, но я понимаю, что это может быть невозможно. Однако чем ближе я к этому подберусь, тем лучше.
Возможные варианты:
SQLite в памяти
SQLite сам по себе не кажется достаточно быстрым для моего варианта использования, поскольку он поддерживается диском и поэтому должен будет считывать файл при каждом выполнении. Возможно, это не так плохо, как кажется, но постоянно хранить базу данных в памяти представляется необходимым. SQLite позволяет БД использовать память в качестве хранилища, но эти БД уничтожаются при выходе из программы и не могут быть разделены между экземплярами.
Плоская файловая база данных загружается в память с помощью mmap
На противоположном конце спектра я могу записывать кеши на диск, а затем загружать их в память с помощью mmap, может совместно использовать одно и то же пространство памяти между отдельными выполнениями . Однако мне не ясно, что произойдет с mmap, если все процессы завершатся.Ничего страшного, если mmap в конечном итоге будет сброшен из памяти, но я бы хотел, чтобы он задержался на некоторое время (30 секунд? несколько минут?), чтобы пользователь мог запускать команды одну за другой, а кеш можно было использовать повторно. Этот примеркажется подразумевает, что должен быть открытый дескриптор mmap, но я не нашел точного описания того, когда отображаемые в память файлы удаляются из памяти и должны быть перезагружены с диска.
Я думаю, что мог бы реализовать это, если объекты mmap остаются после выхода, но это кажется очень низким уровнем, и я полагаю, что кто-то уже реализовал более элегантное решение. Я бы не хотел начинать создавать это только для того, чтобы понять, что я перестраивал SQLite. С другой стороны, мне кажется, что это будет очень быстро, и я мог бы сделать оптимизацию, учитывая мой конкретный вариант использования.
Совместное использование объектов Python между процессами с помощью Processing
В пакете Processing указано: «Объекты могут совместно использоваться процессами с использованием ... общей памяти». Просматривая остальные документы, я не нашел дальнейших упоминаний об этом поведении, но звучит оченьмногообещающе. Кто-нибудь может направить меня к дополнительной информации?
Хранение данных на RAM-диске
Меня беспокоят возможности ОС, но я мог создать RAM-диски затем просто читать/записывать на него по своему усмотрению (SQLite?). Пакет fs.memoryfsкажется многообещающей альтернативой для работы с несколькими ОС, но комментарии подразумевают немало ограничений.
Я знаю, что pickle— это эффективный способ хранения объектов Python, поэтому он может иметь преимущество в скорости по сравнению с любым видом ручного хранения данных. Могу ли я подключить рассол к любому из вышеперечисленных вариантов? Будет ли это лучше, чем плоские файлы или SQLite?
Я знаю, что есть много вопросов, связанных с этим, но я немного покопался и не смог найти ничего, что напрямую отвечало бы моему вопросу относительно многократного выполнения командной строки.
Я полностью признаю, что, возможно, слишком много думаю об этом. Я просто пытаюсь прочувствовать свои варианты, и стоят ли они того или нет.
Большое спасибо за помощь!