我需要在操作系统块缓存中保留尽可能多的大文件,即使它比我可以放入 ram 的要大,而且我正在不断地读取另一个非常大的文件。ATM 当我从另一个文件流式读取时,我将从系统缓存中删除大块的大型重要文件。
6 回答
在 linux 中,您可以将文件系统挂载为tmpfs类型,如果需要,它使用可用的交换内存作为支持。您应该能够创建一个大于内存大小的文件系统,并且它将优先考虑该文件系统在系统缓存中的内容。
mount -t tmpfs none /mnt/point
见: http: //lxr.linux.no/linux/Documentation/filesystems/tmpfs.txt
您还可以从这些文件中swapiness
受益drop_cache
/proc/sys/vm
如果您使用的是 Windows,请考虑使用标志打开您正在扫描的文件
FILE_FLAG_SEQUENTIAL_SCAN
你也可以使用
FILE_FLAG_NO_BUFFERING
对于该文件,但它对您的读取大小和缓冲区对齐施加了一些限制。
在 Linux 或 Solaris 等 POSIX 系统中,尝试使用 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 这样的旧版本也可以做更多的基本技巧。但我不知道我脑海中的功能,也没有时间查找它们。
某些操作系统具有 ramdisk,您可以使用它来留出一段 ram 用于存储,然后将其挂载为文件系统。
但是,我不明白为什么要阻止操作系统缓存文件。你的完整问题对我来说真的没有意义。
购买更多的内存(它相对便宜!)或让操作系统做它的事情。我想你会发现绕过操作系统会比它的价值更麻烦。操作系统将根据需要缓存尽可能多的文件,直到您的或任何其他应用程序需要内存。
我想你可以尽量减少进程的数量,但购买更多的内存可能会更快。
mlock() 和 mlockall() 分别将调用进程的部分或全部虚拟地址空间锁定到 RAM 中,防止该内存被分页到交换区域。
(从 MLOCK(2) Linux 手册页复制)