将文件保存在OS块缓冲区中

时间:2020-03-06 14:41:56  来源:igfitidea点击:

我需要在操作系统块缓存中保留尽可能多的大文件,即使它比我可以在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之类的较早版本也可以做更多的基本技巧。但是我不了解这些功能,也没有时间查找它们。