Я только что обнаружил, что мой программист фактически загружал всю базу данных SQLite в списки (выберите * из имени таблицы) (для операций поиска и фильтрации) вместо того, чтобы выполнять операторы SQL по отдельности.Это хорошо работало, когда было менее 20 000 - 50 000 записей.Но как только память заканчивается или количество записей превышает определенное, приложение Delph 7 зависает.
Слишком поздно менять этот подход, так как мы углубились в проект, и он был развернут.У меня нет времени, чтобы переделать решение, поэтому мне нужно найти «быстрое решение», чтобы уменьшить использование памяти и увеличить количество записей в базе данных.Мне интересно, можно ли разбить список на файлы, а затем обрабатывать один за другим?
Обновлен, чтобы добавить ответ ОП на вопрос
Спасибо за ответ.Вот некоторые фрагменты кода о том, как записи sqlite загружаются в запись, которая затем используется в приложении.Может быть до 200 000 записей, которые занимают много памяти.Есть ли способ буферизовать запись в файле?
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']);