2010-09-24 12 views
0

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

Я предполагаю, что для решения потребуется некоторая сложная координация между настраиваемой файловой системой и ручным манипулированием таблицами страниц: добавьте блок в индексный дескриптор, как-то обновите кэшированные страницы в VMM, чтобы отразить это, а затем как-то swizzle таблицу страниц для соответствия. Это звучит нетривиально, что заставляет меня задаться вопросом, есть ли лучший способ.

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

+0

Я вижу много угловых случаев - например. Что происходит с смещениями файлов в этом файле? Как быть с файлами в других процессах? – caf

+0

Не зная, что вы делаете, это может быть глупое предложение, но можете ли вы поместить физический файл с помощью X-страниц, прежде чем вы его захотите? Держите указатель/указатель/смещение на первой странице, где начинаются реальные данные, и изменяйте их по мере необходимости. Больше работы вокруг, но вы, похоже, готовы заняться этой работой. – Duck

+0

@ Duck: У меня нет заданной цели. Я хотел что-то вроде этого, имея дело с большими инвертированными индексами для полнотекстового поиска и при поиске способов улучшить B-Trees. Начиная с крайне редкого файла, это интересная идея, но не решает общий случай. –

ответ

2

Внесите простой FAT в свой файл. Например, первые 4k файла будут страницей FAT. Данные будут на следующих страницах. Первая страница FAT могла ссылаться на другие страницы FAT по мере роста вашего файла. Каждая запись в жире будет индексом страницы данных и индексом следующей записи FAT. Запись FAT будет страницей FAT и индексом на этой странице самой записи. Я думаю, вы поняли. Записи FAT представляют собой Связанный список. Страницы FAT являются связанным списком. Записи FAT связывают страницы данных. Это должно быть достаточно информации для использования remap_file_pages(), чтобы сделать ваш файл постоянным в памяти, даже если он не соприкасается с диском.