Хранение файла в буфере блока ОС - PullRequest
2 голосов
/ 25 сентября 2008

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

Ответы [ 6 ]

3 голосов
/ 30 сентября 2008

В системе POSIX, такой как Linux или Solaris, попробуйте использовать posix_fadvise.

В потоковом файле сделайте что-то вроде этого:

posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
while( bytes > 0 ) {
  bytes = pread(fd, buffer, 64 * 1024, current_pos);
  current_pos += 64 * 1024;
  posix_fadvise(fd, 0, current_pos, POSIX_FADV_DONTNEED);
}

И вы можете применить POSIX_FADV_WILLNEED к вашему другому файлу, который должен повысить приоритет памяти.

Теперь я знаю, что Windows Vista и Server 2008 также могут делать изящные трюки с приоритетами памяти. Вероятно, более старые версии, такие как XP, также могут выполнять более простые приемы. Но я не знаю этих функций, и у меня нет времени на их поиск.

3 голосов
/ 30 сентября 2008

Если вы используете Windows, попробуйте открыть файл, который вы просматриваете, с флагом

FILE_FLAG_SEQUENTIAL_SCAN

Вы также можете использовать

FILE_FLAG_NO_BUFFERING

для этого файла, но он накладывает некоторые ограничения на ваш размер чтения и выравнивание буфера.

3 голосов
/ 25 сентября 2008

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

mount -t tmpfs none /mnt/point

См .: http://lxr.linux.no/linux/Documentation/filesystems/tmpfs.txt

Вы также можете воспользоваться файлами swapiness и drop_cache в пределах /proc/sys/vm

1 голос
/ 25 сентября 2008

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

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

0 голосов
/ 30 сентября 2008

mlock () и mlockall () соответственно блокируют часть или все виртуальное адресное пространство вызывающего процесса в ОЗУ, предотвращая перенос этой памяти в область подкачки.

(скопировано со справочной страницы Linux MLOCK (2))

0 голосов
/ 25 сентября 2008

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

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

...