分页: 1 / 1

请问,为什么对于自己写的C++read文件程序PrimoCache不能够缓存命中

发表于 : 周日 4月 23, 2023 11:35 am
asd
请问,为什么使用PrimoCache将硬盘缓存,通过Anvil'Storage工具读可以看到缓存命中率100%,而使用自己写的c++程序read 该硬盘的数据命中率是0

代码: 全选

fopen_s(&f, filename, "rb");
	read(pRead, m_hMappingSize, f);
	void read(const void* pdata, UINT64 datasize, FILE* f)
	{
		UINT64 bufsize = datasize;
		UINT8* pdataadr = (UINT8*)pdata;

		while (bufsize > 1073741824)
		{
			fread(pdataadr, 1, 1073741824, f);
			pdataadr += 1073741824;
			bufsize -= 1073741824;
		}
	fread(pdataadr, 1, bufsize, f);
	}

Re: 请问,为什么对于自己写的C++read文件程序PrimoCache不能够缓存命中

发表于 : 周一 4月 24, 2023 5:45 pm
Support
文件第一次读取的时候,由于此时没有缓存,PrimoCache是从硬盘读取的。当文件再次读取的时候,由于Windows文件系统缓存已经缓存了该文件,所以不会再发送读请求到硬盘,相应地,PrimoCache也不会收到读取请求。您可以看到此时“读取总计”不会增加。只有Windows文件系统缓存没有该文件时才会发送请求到PrimoCache。Anvil'Storage等工具是测试硬盘性能用的,所以它们发送的IO请求都加了标志,告诉Windows不进行文件系统缓存。

Re: 请问,为什么对于自己写的C++read文件程序PrimoCache不能够缓存命中

发表于 : 周一 4月 24, 2023 5:54 pm
asd
Support 写了: 周一 4月 24, 2023 5:45 pm 文件第一次读取的时候,由于此时没有缓存,PrimoCache是从硬盘读取的。当文件再次读取的时候,由于Windows文件系统缓存已经缓存了该文件,所以不会再发送读请求到硬盘,相应地,PrimoCache也不会收到读取请求。您可以看到此时“读取总计”不会增加。只有Windows文件系统缓存没有该文件时才会发送请求到PrimoCache。Anvil'Storage等工具是测试硬盘性能用的,所以它们发送的IO请求都加了标志,告诉Windows不进行文件系统缓存。
非常感谢您的回答,我的需求是使用PrimoRamDisk或者PrimoCache加速我自己程序的读写,但是以PrimoRamDisk为例,我将要通过代码读的文件放在内存映射的硬盘里读,速度并没有加快,请问这应该怎么解决呢?我也尝试过使用ReadFile进行读取,同样速度没有加快。

Re: 请问,为什么对于自己写的C++read文件程序PrimoCache不能够缓存命中

发表于 : 周二 4月 25, 2023 12:16 pm
Support
asd 写了: 周一 4月 24, 2023 5:54 pm 非常感谢您的回答,我的需求是使用PrimoRamDisk或者PrimoCache加速我自己程序的读写,但是以PrimoRamDisk为例,我将要通过代码读的文件放在内存映射的硬盘里读,速度并没有加快,请问这应该怎么解决呢?我也尝试过使用ReadFile进行读取,同样速度没有加快。
您的文件大概多大呢?文件是程序自己生成的吗?如果是文件是程序自己生成的,那么Ramdisk或PrimoCache应该都能起到作用。
小文件可以用Ramdisk。文件很多内存盘不够覆盖的话,可用PrimoCache并开启延时写入。

您如果是将文件先读出来放到内存盘,后续的读写都是在Windows文件系统中进行,实际都是在内存中进行,此时是看不出太大区别的。此外,如果本身读写数据量不多,肉眼也不会感觉到区别。(当然您可以在程序中统计读写时间)