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