我刚刚发现我的程序员实际上是将整个SQLite数据库加载到列表中(select * from tablename)(用于搜索和筛选操作),而不是单独执行sql语句。只有少于20,000到50,000条记录时,这种方法运行良好。但是一旦内存不足,或者超过一定数量的记录,Delph 7应用程序就会冻结。如何使用Delphi处理有限内存的非常大的列表
因为我们深入到项目中并且已经部署,所以改变这种方法为时已晚。我没有时间重做解决方案,因此我需要找到一个“快速修复”来减少内存使用量并增加数据库中的记录数。我想知道是否有可能将列表分割成文件然后逐个处理?
更新添加有机磷农药回答质疑
感谢回答。以下是关于如何将sqlite记录加载到整个应用程序中使用的记录中的代码片段。可以有多达20万条记录,这会消耗大量的内存。有没有办法缓冲文件中的记录?
type
TMyDatabase = class(TThread)
private
Owner: TComponent;
FSqldb: TSQLiteDatabase;
FSltb: TSQLIteTable;
.....
type
PMyMessageRec = ^TMyMessageRec;
TMyMessageRec = record
Id: integer;
RcptId: integer;
PhoneNumber: ShortString;
Text: string;
......
end;
procedure TMyDatabase.Execute;
........
begin
...........
FSltb := FSqldb.GetTable('SELECT * FROM Messages ORDER BY ID LIMIT ' + IntToStr(MaximumMessages));
try
Synchronize(SyncLoadAllMessages);
Synchronize(SyncLoadMessages);
finally
FSltb.Free;
end;
procedure TMyDatabase.SyncLoadAllMessages;
var MessRec: PMyMessageRec;
.......
begin
....
while not FSltb.EOF do
Begin
if TerminateAll then exit;
New(MessRec);
MessRec.Id := FSltb.FieldAsInteger(FSltb.FieldIndex['ID']);
MessRec.RcptId := FSltb.FieldAsInteger(FSltb.FieldIndex['RecipientId']);
MessRec.PhoneNumber := FSltb.FieldAsString(FSltb.FieldIndex['RecipientPhone']);
MessRec.Text := FSltb.FieldAsString(FSltb.FieldIndex['Text']);
MessRec.Charset := FSltb.FieldAsString(FSltb.FieldIndex['Charset']);
你参考的数据集列表?或者您也可以成功打开数据集,但还有从数据集填充的其他列表(?)? –
你可以发表一些填充列表的实际代码行,以及变量的声明,以便我们可以看到涉及的事物类型? – hatchet
没有这样的事情,“做错了,因为没有时间做正确的事情”。做错了,从长远来看需要更多的时间。 –