将文件保存在OS块缓冲区中
-
02-07-2019 - |
题
我需要尽可能多地保留操作系统块缓存中的大文件,即使它比我在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手册页复制)