Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件耐久性设置_C++_Windows_File - Fatal编程技术网

C++ 文件耐久性设置

C++ 文件耐久性设置,c++,windows,file,C++,Windows,File,我正在开发一个ACID数据库软件产品,我对WinOS上的文件持久性有一些疑问 有两个属性,文件标志\写入\通过和文件标志\无缓冲-我是否需要这两个属性来实现文件持久性(即覆盖所有类型的磁盘或操作系统文件缓存)?我这样问是因为它们似乎做了相同的事情,设置文件\u标志\u无\u缓冲会导致抛出错误\u无效\u参数错误 FILE\u FLAG\u NO\u BUFFERING指定不在所有位置进行缓存。不进行读或写缓存所有数据直接从应用程序传输到磁盘。如果您读到这么大的块,缓存是无用的,或者您自己进行缓存

我正在开发一个ACID数据库软件产品,我对WinOS上的文件持久性有一些疑问


有两个属性,文件标志\写入\通过文件标志\无缓冲-我是否需要这两个属性来实现文件持久性(即覆盖所有类型的磁盘或操作系统文件缓存)?我这样问是因为它们似乎做了相同的事情,设置文件\u标志\u无\u缓冲会导致抛出错误\u无效\u参数错误

FILE\u FLAG\u NO\u BUFFERING
指定不在所有位置进行缓存。不进行读或写缓存所有数据直接从应用程序传输到磁盘。如果您读到这么大的块,缓存是无用的,或者您自己进行缓存,那么这通常是有用的。请注意WhozCraig关于在使用此标志时正确对齐数据的评论

FILE\u FLAG\u WRITE\u THROUGH
仅表示写入操作应在函数返回之前直接写入磁盘。这就足以实现ACID,同时它还为操作系统提供了缓存文件数据的选项


使用
FlushFileBuffers()
可以提供一种更有效的实现ACID的方法,因为您可以对一个文件进行多次写入,然后一次性刷新它们。在一次刷新中合并写入非常重要,因为非缓存写入将限制硬盘驱动器的主轴速度。7200 rpm磁盘每秒最多120次非缓存写入或刷新。

文件标志\u无缓冲
指定无缓存。无读或写缓存所有数据直接从应用程序传输到磁盘。如果您读取了如此大的数据块,以致于缓存没有用处,或者您自己进行缓存,那么这是非常有用的。请注意WhozCraig关于在使用此标志时正确对齐数据的评论

FILE\u FLAG\u WRITE\u THROUGH
仅表示写入操作应在函数返回之前直接写入磁盘。这就足以实现ACID,同时它还为操作系统提供了缓存文件数据的选项


使用
FlushFileBuffers()
可以提供一种更有效的实现ACID的方法,因为您可以对一个文件进行多次写入,然后一次性刷新它们。在一次刷新中合并写入非常重要,因为非缓存写入将限制硬盘驱动器的主轴速度。7200 rpm磁盘每秒最多120次非缓存写入或刷新。

您对文件缓冲的描述不完全准确。它确实告诉IO系统不要为读取或写入设置缓冲区。但是,您需要的关键数据是:在调用
ReadFile
WriteFile
期间,您提供的任何缓冲区都缺少对齐要求。您提供的缓冲区必须位于与文件所在卷的扇区大小的偶数倍对齐的内存上。有关这方面的更多信息,请参阅我们有自己的缓冲区管理器,它处理磁盘扇区到内部内存的缓存,您仍然建议使用文件\u FLA\u WRITE\u到文件\u FLAG\u NO\u缓冲吗?两者之间有性能差异吗?说到刷新文件缓冲区,我认为我们不应该这样做,因为我们需要刷新单个磁盘扇区-我们的磁盘管理器处理所有多线程文件访问逻辑,包括正确的磁盘扇区刷新。很难说。操作系统缓冲的开销很小,所以我怀疑关闭它会带来很多好处,在某些情况下打开它可能会带来一些好处。。。我认为最好测试一下。您对文件\u标志\u无\u缓冲的描述并不完全准确。它确实告诉IO系统不要为读取或写入设置缓冲区。但是,您需要的关键数据是:在调用
ReadFile
WriteFile
期间,您提供的任何缓冲区都缺少对齐要求。您提供的缓冲区必须位于与文件所在卷的扇区大小的偶数倍对齐的内存上。有关这方面的更多信息,请参阅我们有自己的缓冲区管理器,它处理磁盘扇区到内部内存的缓存,您仍然建议使用文件\u FLA\u WRITE\u到文件\u FLAG\u NO\u缓冲吗?两者之间有性能差异吗?说到刷新文件缓冲区,我认为我们不应该这样做,因为我们需要刷新单个磁盘扇区-我们的磁盘管理器处理所有多线程文件访问逻辑,包括正确的磁盘扇区刷新。很难说。操作系统缓冲的开销很小,所以我怀疑关闭它会带来很多好处,在某些情况下打开它可能会带来一些好处。。。我认为最好测试一下。当使用FILE\u FLAG\u NO\u缓冲时,您收到的错误是因为您使用的缓冲区(用于读或写)的内存地址没有正确对齐。有关为什么会出现这种情况以及前面提到的缓冲IO系统的优点和潜在缺陷的信息,请参阅。使用文件\u标志\u否\u缓冲时收到的错误是因为您使用的缓冲区(用于读或写)的内存地址未正确对齐。有关为什么会出现这种情况的信息,以及前面提到的缓冲IO系统的优点和潜在缺陷,请参阅。