CACHE 的问题,高手请进! (200分)

G

GGCAT

Unregistered / Unconfirmed
GUEST, unregistred user!
就象CPU 的CACHE一样。 ,通过一次一次的查询更新缓冲,使之接近
优化状态。我使用了书上的 FIFO,LRU,LFU 等方法,都不是很理想,哪位有
好的想法,请不吝赐教。
输入端每秒输入约4000个数据块, 每个数据块的长度在 512 Byte 到 2048 Byte 不等
我对这些数据块加工(比较耗费时间)后送往输出端。 实际上,有很多数据块是会重
复的。 为了减少加工负担,我在输入和处理之间加入了一定容量的缓冲。这样,在处
理数据时我就先在缓冲中查看有没有处理过,如果在缓冲中,就直接送出结果数据,否
则再处理,然后把当前数据块放入缓冲。 我要解决的问题是如何进行缓冲区内容的更新,
才能达到比较高的缓冲命中率。 伪代码如下:

While Not EndOfDatado

begin
Data:=GetNextData;
//获取下一输入块
CacheHit:= SearchInCache(Data);
//在缓冲中查找
IF CacheHit>0
then
OutPut(CacheList[CacheHit].Result) //命中则直接出结果
else
begin
Result:=DataProcess(Data);
//未命中先处理
OutPut(Result);
//输出结果
CacheUpdate(Data,Result);
*****更新缓冲内容****
end;
end;

问题就在 如何优化地更新缓冲内容,书上的FIFO,LRU,LFU都不理想
 
大型数据库本身就管理查询的缓存,已经优化了,
似乎不用你自己来重起炉灶
 
老大啊 我指的可不是数据库啊 是数据集合 不是在数据库中的
是一些通常意义的数据堆和很多 Offset 地址 而我在很多个小段
中查找匹配内存段
 
你的应用是干吗的?
不管你是用DELPHI还是VC++
都可用对象列表方式进行缓存.
如下:
procedure TCQBroker.FetchAllCQObjs(const ASQL: string;
const Args: array of const;
const AObjIDFieldName: string;
const AObjClass: TCQObjClass;
AObjList: TObjectList);
var
Obj: TCQObj;
begin
AObjList.OwnsObjects := True;
AObjList.Clear;
with FCallDBdo
begin
SqlOpen(Format(ASQL, Args));
while not DataSet.Eofdo
begin
Obj := AObjClass.Create;
Obj.SelectByID(DataSet.FieldByName(AObjIDFieldName).AsInteger);
AObjList.Add(Obj);
DataSet.Next;
end;
SqlOpenend;
end;

end;

 
谢谢 leepin
谢谢 笑傲江湖
不过好象我的问题可能没问清楚 实际情况是

输入端每秒输入约4000个数据块, 每个数据块的长度在 512 Byte 到 2048 Byte 不等
我对这些数据块加工(比较耗费时间)后送往输出端。 实际上,有很多数据块是会重
复的。 为了减少加工负担,我在输入和处理之间加入了一定容量的缓冲。这样,在处
理数据时我就先在缓冲中查看有没有处理过,如果在缓冲中,就直接送出结果数据,否
则再处理,然后把当前数据块放入缓冲。 我要解决的问题是如何进行缓冲区内容的更新,
才能达到比较高的缓冲命中率。 伪代码如下:

While Not EndOfDatado

begin
Data:=GetNextData;
//获取下一输入块
CacheHit:= SearchInCache(Data);
//在缓冲中查找
IF CacheHit>0
then
OutPut(CacheList[CacheHit].Result) //命中则直接出结果
else
begin
Result:=DataProcess(Data);
//未命中先处理
OutPut(Result);
//输出结果
CacheUpdate(Data,Result);
*****更新缓冲内容****
end;
end;

问题就在 如何优化地更新缓冲内容,书上的FIFO,LRU,LFU都不理想



 
另类的解决办法(以空间换时间):
While Not EndOfDatado

begin
Data:=GetNextData;
//获取下一输入块
DBHit:= SearchInDB(Rec.Data);
//在数据库中查找
IF DBHit>0
then
OutPut(Rec.result) //命中则直接出结果
else
begin
Result:=DataProcess(Data);
//未命中先处理
OutPut(Result);
//输出结果
DBUpdate(Data,Result);
//更新数据库内容
end;
end;
 
lru:least recently used
lfu:least frequently used
fifo:first in first out
这些算法的效率都和数据存储的结构和缓冲区相关,所以要分析例如需要更新的频率等。
 
多人接受答案了。
 
顶部