Мне интересно, есть ли способ вставить пустые страницы в начале большого (многобайтового) файла, который я открыл с помощью mmap(). Очевидно, что можно добавить страницу или две до конца и переместить все вперед с помощью memcpy(), но это будет грязно на каждой странице и потребует очень долгого времени, когда в конце концов будет сброшено на диск.Вставка страниц в большие файлы mmap() без копирования данных
Я предполагаю, что для решения потребуется некоторая сложная координация между настраиваемой файловой системой и ручным манипулированием таблицами страниц: добавьте блок в индексный дескриптор, как-то обновите кэшированные страницы в VMM, чтобы отразить это, а затем как-то swizzle таблицу страниц для соответствия. Это звучит нетривиально, что заставляет меня задаться вопросом, есть ли лучший способ.
Это связано с несколько глубоким вопросом о работе с памятью и файлами в Linux, хотя я был бы рад услышать, как это можно сделать в других системах. Меня не интересуют обходные пути, которые предполагают более эффективное копирование, хотя метод, требующий переназначения, но избегающий диск IO, будет хорошим началом.
Я вижу много угловых случаев - например. Что происходит с смещениями файлов в этом файле? Как быть с файлами в других процессах? – caf
Не зная, что вы делаете, это может быть глупое предложение, но можете ли вы поместить физический файл с помощью X-страниц, прежде чем вы его захотите? Держите указатель/указатель/смещение на первой странице, где начинаются реальные данные, и изменяйте их по мере необходимости. Больше работы вокруг, но вы, похоже, готовы заняться этой работой. – Duck
@ Duck: У меня нет заданной цели. Я хотел что-то вроде этого, имея дело с большими инвертированными индексами для полнотекстового поиска и при поиске способов улучшить B-Trees. Начиная с крайне редкого файла, это интересная идея, но не решает общий случай. –