将文件保存在OS块缓冲区中
我需要在操作系统块缓存中保留尽可能多的大文件,即使它比我可以在ram中容纳的更大,而且我还在不断读取另一个非常大的文件。当我从另一个文件流式读取时,ATM将从系统缓存中删除大块的重要文件。
解决方案
某些操作系统具有ramdisk,我们可以使用它们放置一部分ram进行存储,然后将其挂载为文件系统。
不过,我不明白的是为什么要阻止操作系统缓存文件。完整问题对我来说真的没有任何意义。
在linux中,我们可以将文件系统挂载为tmpfs类型,如果需要,它将使用可用的交换内存作为后备。我们应该能够创建一个大于内存大小的文件系统,它将优先考虑该文件系统在系统缓存中的内容。
mount -t tmpfs none /mnt/point
请参阅:http://lxr.linux.no/linux/Documentation/filesystems/tmpfs.txt
我们还可以从/ proc / sys / vm中的文件swwarness和drop_cache中受益。
购买更多的ram(相对便宜!)或者让OS来做。我想我们会发现,规避操作系统将比其应有的麻烦多得多。操作系统将根据需要缓存尽可能多的文件,直到或者任何其他应用程序需要内存为止。
我想我们可以最大程度地减少进程数量,但是购买更多内存可能更快。
mlock()和mlockall()分别将部分或者全部调用过程虚拟地址空间锁定到RAM中,以防止将该内存分页到交换区。
(从MLOCK(2)Linux手册页复制)
如果我们使用的是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之类的较早版本也可以做更多的基本技巧。但是我不了解这些功能,也没有时间查找它们。