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


В некоторых операционных системах есть RAM-диски, которые можно использовать, чтобы выделить сегмент RAM для хранения, а затем смонтировать его как файловую систему.
Однако я не понимаю, почему вы хотите, чтобы операционная система не кэшировала файл. Ваш полный вопрос действительно не имеет для меня смысла.
В Linux вы можете смонтировать файловую систему как тип tmpfs, который при необходимости использует доступную память подкачки в качестве поддержки. Вы должны иметь возможность создать файловую систему, размер которой превышает размер вашей памяти, и она будет отдавать приоритет содержимому этой файловой системы в системном кеше.
mount -t tmpfs none /mnt/point
См .: http://lxr.linux.no/linux/Documentation/filesystems/tmpfs.txt
Вы также можете воспользоваться файлами swapiness и drop_cache в /proc/sys/vm.
Купите больше оперативной памяти (это относительно дешево!) Или позвольте ОС делать свое дело. Я думаю, вы обнаружите, что обход ОС доставит больше проблем, чем того стоит. ОС будет кэшировать столько файла, сколько необходимо, до тех пор, пока вашему или любому другому приложению не понадобится память.
Я думаю, вы могли бы минимизировать количество процессов, но, вероятно, быстрее купить больше памяти.
mlock () и mlockall () соответственно блокируют часть или все виртуальное адресное пространство вызывающего процесса в ОЗУ, предотвращая подкачку этой памяти в область подкачки.
(скопировано из справочной страницы MLOCK (2) Linux)
Если вы используете Windows, рассмотрите возможность открытия файла, который вы сканируете, с помощью флага
FILE_FLAG_SEQUENTIAL_SCAN
Вы также можете использовать
FILE_FLAG_NO_BUFFERING
для этого файла, но он накладывает некоторые ограничения на размер чтения и выравнивание буфера.
В системе 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, также могут выполнять более простые трюки. Но я не знаю, что такое функции, и у меня нет времени их искать.
Да .. Я виню поздний час в своих безразличных заявлениях. Но я изменил вопрос ..