能力值:
( LV2,RANK:10 )
|
-
-
76 楼
黑盒中每一种数值连续出现的次数不一定是相同的.但即使不同,也不会相差太远. 例如: 不会出现的情况: 某处有10000个连续的1,紧接着出现50个连续的2. 常见的情况 : 某处有10000个连续的1,紧接着出现的2可能在7654--13456之间.
我的意思就是利用这个信息来加速。
还有,你写数据时怎么写的?如果先把数据缓存到一定程度再写会比一点一点写快不少。磁盘一次读写的数据
量越大性能越好(速度快而且对硬盘伤害小)。这个也是瓶颈。
当今对于大型系统来说,CPU,内存的速度都不是什么瓶颈了,主要瓶颈在于磁盘和网络的IO操作。
|
能力值:
( LV2,RANK:10 )
|
-
-
77 楼
我知道黑盒中的数据总数,然后内存映射文件。。写的时候,发现在x处是分界了,于是
memset(pBuf + pos, byVal, x2 - x1); 这个应该不影响速度,,
那个连续数只能确定在2W左右。但没有一个具体的范围,想动态调整的话,怕意义不大。
|
能力值:
( LV2,RANK:10 )
|
-
-
78 楼
都是高手,膜拜。
|
能力值:
( LV2,RANK:10 )
|
-
-
79 楼
看完这么多高手,小弟深受启发啊啊
|
能力值:
(RANK: )
|
-
-
80 楼
临时用户好像发不了PM的, 你还是直接PM邀请码给他吧.
|
能力值:
( LV2,RANK:10 )
|
-
-
81 楼
看不太懂C++,要求都还不太明白,我想用D写试试
|
能力值:
( LV2,RANK:10 )
|
-
-
82 楼
VOID ReadAll(DWORD m_BoxLength)//遍历并保存到文件或内存
{
DWORD dwPos = 0;
DWORD m_Current = 0;
int m_FileLength=0;
char*pFileMem=pFile; //pFile是内存映射的文件缓冲指针
while(m_Current < m_BoxLength)
{
BOOL IsEnd = FALSE;
DWORD m_HeiPos = m_Current + 20000; //20000为最少重复字符数值
if(m_HeiPos > m_BoxLength)
{
m_HeiPos = m_BoxLength;
IsEnd = TRUE;
}
BYTE m_Vaule = GetPosValue(m_Current);
if(IsEnd == FALSE)
{
while(m_Vaule == GetPosValue(m_HeiPos))
{
m_HeiPos += 20000;
if(m_HeiPos > m_BoxLength)
{
m_HeiPos = m_BoxLength;
IsEnd = TRUE;
break;
}
}
}
if(IsEnd == FALSE)
{
int m_LowPos = m_HeiPos - 20000;
while(1)
{
int m_MidPos = (m_LowPos+m_HeiPos) / 2; //取中间值
if(m_Vaule == GetPosValue(m_MidPos))
m_LowPos = m_MidPos;
else
m_HeiPos = m_MidPos;
if(m_HeiPos = m_LowPos + 1) //修改后代码
break;
}
}
*pFileMem++=m_Vaule;//这一句和下一句完成压缩保存将时间缩短
*((int*)pFileMem)=m_HeiPos - m_Current
pFileMem+=4;
dwPos += (m_HeiPos - m_Current);
m_Current = m_HeiPos;
}
SaveToFile(pFile,pFileMem-pFile);//在这里一次性保存文件,pFileMem-pFile是文件长度
}
还有你不必将 int m_MidPos = (m_LowPos+m_HeiPos) / 2; //取中间值
修改为int m_MidPos = m_LowPos + (m_HeiPos - m_LowPos) / 2; //修改:取中间值
因为这两者的结果完全相等,而前者速度快
更没必要将 if(m_HeiPos = m_LowPos + 1) //修改后代码
修改为 if (GetPosValue(m_LowPos) != GetPosValue(m_LowPos + 1))//修改这里的退出条件
因为只有高低端数据不相等时才能进入while(1)这个循环,用前者判断足矣,况且你这样一修改,如果GetPosValue非常耗时,就可能使时间慢两倍
自己好好想想吧
|
能力值:
( LV2,RANK:10 )
|
-
-
83 楼
不知问题解决没有?
我是不会..
|
能力值:
( LV2,RANK:10 )
|
-
-
84 楼
*pFileMem++=m_Vaule;//这一句和下一句完成压缩保存将时间缩短
*((int*)pFileMem)=m_HeiPos - m_Current;
他这两句将时间大幅缩短,将文件长度由原来的1G压缩为4000分之一以下,因此读写磁盘的时间缩短了许多,总时间毫无疑问缩短许多,并且遍历方法非常高效,问题应该已经解决
|
能力值:
( LV2,RANK:10 )
|
-
-
85 楼
你可以用哈希表,试试!
|
能力值:
( LV3,RANK:20 )
|
-
-
86 楼
慢慢看 慢慢学习 多谢大牛辛勤付出。。。
|
|
|