我需要尽可能多地保留操作系统块缓存中的大文件,即使它比我在ram中更大,并且我不断读取另一个非常大的文件。 ATM当我从另一个文件中读取流时,我将从系统缓存中删除大块重要文件。

有帮助吗?

解决方案

在像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这样的旧版本也可以做更多的基本技巧。但我不知道我的头脑中的功能,也没有时间查找它们。

其他提示

在linux中,您可以将文件系统挂载为 tmpfs 类型,如果需要,它可以使用可用的交换内存作为后备。您应该能够创建一个大于内存大小的文件系统,它将优先考虑系统缓存中该文件系统的内容。

mount -t tmpfs none /mnt/point

请参阅: http://lxr.linux.no/linux/Documentation /filesystems/tmpfs.txt

您也可以从 / proc / sys / vm

中的 swapiness drop_cache 文件中受益。

如果您使用的是Windows,请考虑使用标记

打开您正在扫描的文件
FILE_FLAG_SEQUENTIAL_SCAN

您也可以使用

FILE_FLAG_NO_BUFFERING

该文件,但它对读取大小和缓冲区对齐施加了一些限制。

某些操作系统有ramdisks,您可以使用它来预留一段ram进行存储,然后将其作为文件系统挂载。

但是,我不明白为什么要保持操作系统不缓存文件。你的完整问题对我来说没有意义。

购买更多ram(它相对便宜!)或让操作系统做它的事情。我想你会发现绕过操作系统会比它的价值更麻烦。操作系统将根据需要缓存尽可能多的文件,直到您的或任何其他应用程序需要内存。

我想你可以减少进程数量,但购买更多内存可能会更快。

mlock()和mlockall()分别将部分或全部调用进程的虚拟地址空间锁定到RAM中,防止将内存分页到交换区域。

(从MLOCK(2)Linux手册页复制)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top