Objective c 读取二进制文件而不在卷块缓存中进行缓冲

Objective c 读取二进制文件而不在卷块缓存中进行缓冲,objective-c,swift,macos,filesystems,Objective C,Swift,Macos,Filesystems,较旧的、现已弃用的macOS文件系统API提供了标志,用于读取未缓冲的文件 我寻求一种现代的方法来实现这一点,这样我就可以将文件的数据读入内存,而不必在内存中的其他地方(例如卷缓存)进行不必要的缓存 例如,使用fread读取并首先调用setvbuf(fp,NULL,_IONBF,0)在我的测试中没有达到预期效果。我正在寻找其他低级函数,这些函数允许我读入一个准备好的内存缓冲区,并避免缓冲整个数据 背景 我正在写一个文件搜索程序。它读取大量的文件内容(许多GB),这些内容不是也不会被用户使用。将所

较旧的、现已弃用的macOS文件系统API提供了标志,用于读取未缓冲的文件

我寻求一种现代的方法来实现这一点,这样我就可以将文件的数据读入内存,而不必在内存中的其他地方(例如卷缓存)进行不必要的缓存

例如,使用
fread
读取并首先调用
setvbuf(fp,NULL,_IONBF,0)
在我的测试中没有达到预期效果。我正在寻找其他低级函数,这些函数允许我读入一个准备好的内存缓冲区,并避免缓冲整个数据

背景

我正在写一个文件搜索程序。它读取大量的文件内容(许多GB),这些内容不是也不会被用户使用。将所有这些数据缓存在卷缓存中是一种浪费,因为它很快就会被再次读取清除。这还可能导致清除用户或系统实际使用的文件数据,从而导致更多缓存未命中

因此,我应该能够告诉系统我不需要缓存文件数据。集群边界所需的少量缓存不是问题。我在内存中短暂地读取了许多大数据块来搜索它,而这些数据块不需要缓存。

两条建议:

  • 使用系统调用而不是stdio
  • 使用的
    F_NOCACHE
    选项禁用数据缓存
在Swift中,这类似于(为了简洁起见,省略了错误检查):


您知道这样可以避免用读取的数据填充卷缓存吗?你知道我该怎么核实吗?也就是说,是否有一个功能可以检查卷的块是否在缓存中(我有办法计算出文件占用的块号)?@ThomasTempelmann:不幸的是,我不知道如何验证它,我只能建议比较性能。苹果开发者论坛上的这个(旧)帖子也讨论了这一点:
import Foundation

let path = "/path/to/file"
let fd = open(path, O_RDONLY)
fcntl(fd, F_NOCACHE, 1)

var buffer = Data(count: 1024 * 1024)
buffer.withUnsafeMutableBytes { ptr in
    let amount = read(fd, ptr.baseAddress, ptr.count)
}

close(fd)