下午好,我们已经实现了一个C++ cKeyArray类来测试我们是否可以使用Large File API来节省物理内存.在Centos Linux测试期间,我们发现Linux File API与使用堆进行随机访问处理一样快.以下是数字:对于2,700,000行SQL数据库,其中每行的KeySize为62字节,
使用LINUX文件API的cKeyArray类BruteForceComparisons = 197275 BruteForceTimeElapsed = 1,763,504,445微秒每个BruteForce Comparisons需要两次随机访问,每次随机访问所需的平均时间= 1,763,504,445微秒/(2*197275)= 4470微秒
堆,没有cKeyArray类
BruteForceComparisons = 197275 BruteForceTimeElapsed = 1,708,442,690microsecs每次随机访问所需的平均时间= 4300微秒.
在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文件API的速度吗?
之前,我们收到了Stack Overflow关于使用Windows内存映射文件API的许多好建议.基于这些Stack Overflow建议,我们实现了一个正常运行的内存映射文件MRU缓存类.
因为我们想要开发一个跨平台的解决方案,我们希望尽职尽责地了解为什么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,0,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,0,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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
798 次 |
| 最近记录: |