Библиотека или инструменты для управления общими mmapped файлами - PullRequest
1 голос
/ 09 ноября 2011

Отказ от ответственности: Это, вероятно, вопрос исследования, так как я не могу найти то, что ищу, и он довольно специфичен.

Проблема: у меня есть специальное приложение для поиска, которое должно читать файлы размером от 100 КБ до 10 МБкоторые составляют от 0,01 до 10,0 МБ каждый.Каждый файл содержит один массив, который можно напрямую загрузить в виде массива через mmap.Я ищу решение для предварительной загрузки файлов в ОЗУ до того, как они понадобятся, и если системная память заполнена, извлеките уже обработанные файлы.

Я знаю, что это звучит как сочетание управления памятью ОС ичто-то вроде memcached.Что я на самом деле ищу, так это что-то вроде memcached, которое не возвращает строки или значения для ключа, а скорее адрес для начала выбранного массива.Кроме того (это другая тема), я хотел бы иметь возможность управлять общей памятью таким образом, чтобы расстояние между ядром ЦП и ОЗУ было самым коротким на машинах NUMA.

Мой вопрос:"инструмент / библиотека, подобная этой, уже существует?"

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Ваш вопрос относится к этому

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

Полагаю, системный вызов readahead может вам помочь.

0 голосов
/ 10 ноября 2011

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

Подводный камень этой схемы в том, что программа может быть заблокирована на страницах с ошибками. И поскольку он был однопоточным, он был действительно заблокирован. Изменение многопоточной архитектуры потребует защиты хеш-структур и структур LRU с помощью замков и семафоров.

После этого я понял, что выполняю двойную буферизацию: сама ОС имеет идеальный механизм дискового буфера LRU, который, вероятно, умнее моего. Просто открывайте () или mmap () каждый отдельный файл по каждому запросу, только один системный вызов, и (учитывая недавнюю активность) так же быстро, или даже быстрее, чем слой буферизации.

по отношению к СУБД: использование СУБД - это чистый дизайн, но у вас есть минимальные издержки на 3 системных вызова только для того, чтобы получить первый блок данных. И он, безусловно, ( всегда ) будет блокироваться. Но он вполне пригоден для многопоточного проектирования и избавляет вас от боли блокировок и управления буфером.

0 голосов
/ 10 ноября 2011

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

Я не знаю, является ли ваше приложение записывающим и читающим столько файлов. Возможно, вам стоит подумать о переходе на быструю СУБД , такую ​​как PostGresQL или MySQL , или, возможно, вы можете использовать GDBM .

...