Создание кэша в памяти, который сохраняется между выполнениями

Я разрабатываю утилиту командной строки Python, которая потенциально включает в себя довольно большие запросы к набору файлов. Это достаточно конечный список запросов (подумайте об индексированных столбцах БД). Чтобы повысить производительность в процессе, я могу создать отсортированные/структурированные списки, карты и деревьяодин раз и обращаться к ним повторно, вместо того, чтобы каждый раз обращаться к файловой системе. время.

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

Требования:

  • Должен быть быстрым — любой вид обработки для каждого выполнения должен быть сведен к минимуму, включая дисковый ввод-вывод и создание объектов.
  • Должен быть независимым от ОС (или, по крайней мере, иметь возможность использовать аналогичное базовое поведение в Unix/Windows, что более вероятно).
  • Должны быть разрешены достаточно сложные запросы/фильтрация – я не думаю, что карта ключ/значение будет достаточно хорошей
  • Разве ненужно обновлять – (кратко) устаревшие данные все в порядке, это просто кеш, фактические данные записываются на диск отдельно.
  • Невозможно использовать тяжеловесный демон-процесс, такой как MySQL или MemCached — я хочу минимизировать затраты на установку, а просить каждого пользователя установить эти службы — это слишком.

Предпочтения:

  • Я бы хотел, если возможно, вообще избежать какого-либо длительного процесса демона.
  • Хотя я хотел бы иметь возможность быстро обновлять кеш, восстановление всего кеша при обновлении не является концом света, быстрое чтение гораздо важнее, чем быстрая запись.

В моем идеальном фантастическом мире я мог бы напрямую хранить объекты 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?

Я знаю, что есть много вопросов, связанных с этим, но я немного покопался и не смог найти ничего, что напрямую отвечало бы моему вопросу относительно многократного выполнения командной строки.

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

Большое спасибо за помощь!

7
задан Community 23 May 2017 в 10:27
поделиться