Я взял на себя ответственность за часть Программного обеспечения, которая предварительно обрабатывает данные в глубокую структуру каталогов, состоящую из миллионов маленьких (48 КБ) файлов с геохэш-подобной структурой.
Перемещение и копирование этих файлов - настоящая боль.

Сначала я хочу сделать резервную копию данных в некоторый архив, чтобы уменьшить нагрузку на файловую систему. В качестве следующего шага я хочу улучшить инструмент для работы с архивами вместо файлов.

Первая проблема возникает уже после упаковки этих файлов в архив.

Windows zip tool и 7zip прерывают процесс. Также инструмент zip, поставляемый с gnuWin32 Zip 3.0 (July 5th 2008), by Info-Zip отменяет операцию с zip error: Out of memory (local_to_display_string)

Поэтому я ищу совет для двух вопросов:

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

  2. Существует ли библиотека C/C++, которая обеспечивает доступ к архиву как можно ближе к обычной обработке файлов, чтобы изменения в исходном коде были как можно меньше? Само программное обеспечение использует Qt/Boost.

1 ответ1

0

Что касается соответствующего формата файла архива, может быть, вам вообще не нужно его архивировать? Попробуйте использовать tar вместо zip . Если это не поможет, попробуйте организовать их в иерархические структуры, подобно тому, как git или squid хранят большое количество файлов в своей директории кеша, разделяя поддиректории верхнего и второго уровня, например: 16/256/64 , так что вы При открытии этих файлов будет меньше неподтвержденных запросов ввода-вывода.

Во-вторых, вы должны рассмотреть кеширование, вот несколько предложений:

  • используйте Redis или Memcached для кэширования данных в памяти, которые уже были прочитаны,
  • попробуйте поместить их в некоторую файловую систему, такую как ramfs или tmpfs, чтобы они находились в памяти,
  • используйте виртуальную память, такую как vmtouch которая может отображать файлы в виртуальную память, например, чтобы поместить файл в память: vmtouch -vt file123.geo или для мониторинга всей папки, попробуйте: vmtouch -dl /path/dir

Однако, если файлы небольшие и содержат определенные данные (например, геохеш), может быть, стоит импортировать их в базу данных? Таких как MariaDB или MongoDB? Или, может быть, индексировать их с помощью Solr Search или Elastic Search? Но в конечном итоге все зависит от ваших конкретных технических требований.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .