Linux和Windows:使用大文件来保存物理内存

Linux和Windows:使用大文件来保存物理内存,第1张

概述Linux和Windows:使用大文件来保存物理内存

下午好,我们已经实现了一个C ++ cKeyArray类来testing我们是否可以使用Large file API来保存物理内存。 在Centos linuxtesting中,我们发现linux file API与使用堆进行随机访问处理一样快。 这里是数字:对于一个2,700,000行的sql数据库,其中每行的KeySize是62个字节,

cKeyArray类使用liNUX file API BruteForceComparisons = 197275 BruteForceTimeElapsed = 1,763,504,445微秒每个BruteForce比较需要两次随机访问,每个随机访问所需的平均时间= 1,445微秒/(2 * 197275)= 4470微秒

堆,没有cKeyArray类

BruteForceComparisons = 197275 BruteForceTimeElapsed = 1,708,442,690微秒每个随机访问所需的平均时间= 4300微秒。

使用Areo捕捉,阴影,最小化animation和抖动的无边界窗口

如何检测线程或进程是否由于 *** 作系统调度而停止运行

Environment.CurrentDirectory设置为system32; 我如何确定在哪里?

如何读取RAW磁盘的东西,然后写在C + +进一步?

如何使用另一个C ++程序编译C ++代码?

在32位windows上,数字是,

使用windows文件API的cKeyArray类BruteForceComparisons = 197275 BruteForceTimeElapsed = 9243787毫秒每个随机访问的平均时间是23.4毫秒

堆,没有cKeyArray类BruteForceComparisons = 197275 BruteForceTimeElapsed = 2,141,941毫秒平均每次随机访问所需的时间是5.4毫秒

我们想知道为什么linux cKeyArray数字和linux堆数一样好,而在32位windows上,平均堆的随机访问时间是cKeyArray windows file API的4倍。 有什么办法可以加快windows cKeyArray file API?

以前,我们从使用windows内存映射文件API的堆栈溢出中收到了很多很好的build议。 基于这些堆栈溢出的build议,我们已经实现了一个正确运行的内存映射文件MRUcaching类。

因为我们想要开发一个跨平台的解决scheme,所以我们要做尽职调查,看看为什么linux file API速度如此之快? 谢谢。 我们正在尝试发布下面的一部分cKeyArray类实现。

#define KEYARRAY_THRESHolD 100000000 // Use file instead of memory if requirement is above this number cKeyArray::cKeyArray(long RecCount_,int KeySize_,int MatchCodeSize_,char* Tmpfilename_) { RecCount=RecCount_; KeySize=KeySize_; MatchCodeSize=MatchCodeSize_; MemBuffer=0; KeyBuffer=0; Memfile=0; Memfilename[0]='x0'; ReturnBuffer=new char[MatchCodeSize + 1]; if (RecCount*KeySize<=KEYARRAY_THRESHolD) { InMemory=true; MemBuffer=new char[RecCount*KeySize]; memset(MemBuffer,RecCount*KeySize); } else { InMemory=false; strcpy(Memfilename,Tmpfilename_); try { Memfile= new cfile(Memfilename,cfile::Createalways,cfile::ReaDWrite); } catch (cException e) { throw e; } try { Memfile->SetfilePointer( (int64_t)(RecCount*KeySize),cfile::fileBegin); } catch (cException e) { throw e; } if (!(Memfile->SetEndOffile())) throw cException(ERR_fileOPEN,Memfilename); KeyBuffer=new char[KeySize]; } } char *cKeyArray::GetKey(long Record_) { memset(ReturnBuffer,MatchCodeSize + 1); if (InMemory) { memcpy(ReturnBuffer,MemBuffer+Record_*KeySize,MatchCodeSize); } else { Memfile->SetfilePointer((int64_t)(Record_*KeySize),cfile::fileBegin); Memfile->Readfile(KeyBuffer,KeySize); memcpy(ReturnBuffer,KeyBuffer,MatchCodeSize); } return ReturnBuffer; } uint32_t cKeyArray::GetDupeGroup(long Record_) { uint32_t DupeGroup(0); if (InMemory) { memcpy((char*)&DupeGroup,MemBuffer+Record_*KeySize + MatchCodeSize,sizeof(uint32_t)); } else { Memfile->SetfilePointer( (int64_t)(Record_*KeySize + MatchCodeSize),cfile::fileBegin); Memfile->Readfile((char*)&DupeGroup,sizeof(uint32_t)); } return DupeGroup; }

导致缓冲区溢出,segfault

交叉编译找不到crt1.o

服务在手动停止后自动重新启动

将数据序列化代码从C ++ linux / mac移植到C ++窗口

“bash:./a.out:'ld`运行的可执行文件上没有这样的文件或目录

即使在linux中,您的内存映射解决方案也应该比文件解决方案快10倍。 这是我在测试用例中遇到的速度。

每个文件访问系统调用需要数百个cpu周期才能完成。 你的程序可以用来做实际工作的时间。

为什么速度相似的一个解释可能是你的记忆体地图之前没有被使用过。 当第一次访问内存映射页面时,必须将其分配给RAM的物理页面并清零,或者如果是磁盘文件,则必须将其从磁盘加载到RAM中。 所有这些都需要相当长的时间。

如果在使用它之前触摸(读取或写入数值)每个内存4K,则内存映射中的速度应该会显着提高。

在linux上, *** 作系统积极地将文件数据缓存在主内存中 – 因此,尽管没有为文件内容明确分配内存,但是它们仍然存储在RAM中。 这里有一个体面的链接,提供了一些关于页面缓存的更多信息 – 这个描述中只有一点是缺少的,那就是大多数linux文件系统实际上将标准的I / O接口作为页面缓存的精简包装器来实现。 这意味着,即使你没有明确的映射文件,系统仍然把它看作是内存映射下的内存映射。 这就是为什么你看到两种方法大致相同的性能。

我第二个建议是将平台特定的东西分解出来,并且使用哪个应用程序是每个平台最快的。 一定要做基准测试 – 千万不要对性能做出假设。

总结

以上是内存溢出为你收集整理的Linux和Windows:使用大文件来保存物理内存全部内容,希望文章能够帮你解决Linux和Windows:使用大文件来保存物理内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1211699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存