В чем разница между управлением памятью TDataSet и TClientDataset?

Я использую TIBDataSet для извлечения записей из таблицы базы данных Firebird с помощью Delphi 2007. В этой таблице около 1 миллиона записей, и я получаю ошибку Out of memory. Однако тот же запрос выполняется правильно с TClientDataset.

Не могли бы вы рассказать мне о разнице между TClientDataset и TDataSet в отношении управления памятью?


person Aseem Choudhary    schedule 26.12.2012    source источник
comment
Я не знаю, в чем именно между ними разница, но IIRC проблему нехватки памяти в TIBDataset можно решить, установив для свойства Unidirectional значение true. Имейте в виду, что это меняет способ поведения набора данных, поэтому в вашем случае это может не подойти.   -  person Guillem Vicens    schedule 26.12.2012
comment
Обычно, когда я читаю, что кто-то читает 1 миллион пластинок, обычно что-то не так в его дизайне. Обычно есть лучший способ решить вашу проблему.   -  person alzaimar    schedule 26.12.2012
comment
Я понимаю комментарий @alzaimar. С другой стороны: чтение миллиона записей не должно вызывать сбой уровня доступа к данным.   -  person Jeroen Wiert Pluimers    schedule 26.12.2012
comment
Ну, это зависит от машины, других запущенных приложений, в общем: объем доступной памяти, не так ли?   -  person alzaimar    schedule 27.12.2012
comment
Установите для параметра «Однонаправленный» значение «истина», как было сказано выше. И попробуй переосмыслить свою логику. Если вам нужен миллион записей для выполнения некоторых вычислений, лучше сделать это на стороне сервера с помощью SQL-запроса (SELECT с агрегатами или EXECUTE BLOCK для сложных оценок)   -  person Andrej Kirejeŭ    schedule 27.12.2012
comment
я думаю, что Tdataset предоставляет временную память, поэтому, когда лимит памяти превышается, он использует кеш-память, и этот файл хранится с расширением .identcache, и это предоставит кеш-память для выполнения операции, и это ограничение фиксируется для кэш-памяти, а TClientDataset загружает все данные на клиентскую машину. (жесткий диск), поэтому его ограничение привязано к размеру жесткого диска клиентской машины   -  person Aseem Choudhary    schedule 09.01.2013


Ответы (1)


@alzaimar прав, миллионы записей, загруженных в память на 32-битной платформе, будут проблемой, какой бы компонент набора данных вы ни использовали.

Так что память на коробке имеет решающее значение.

Мы делаем то же самое с приложениями, написанными в Delphi 2006. Мы запускаем их на 64-разрядной версии Windows7 или 64-разрядной версии сервера 2008.

Использование дополнительной памяти для ОС и других приложений.

Попробуйте лучший менеджер памяти для Delphi

Также поместите {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} в источник вашего проекта, чтобы получить до 4 ГБ из 32-битной версии Delphi на 64-битной машине.

program Project15;

uses
  Forms,
  Unit15 in 'Unit15.pas' {Form15};

{$R *.res}

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

begin
  Application.Initialize;
  Application.CreateForm(TForm15, Form15);
  Application.Run;
end.

Выполнение вышеизложенного позволит вам увидеть, что лучше всего подходит для вашего приложения TDataSet или TClientDatset.

Вы также можете рассмотреть возможность использования некоторых сторонних компонентов подключения к данным, которые имеют улучшенную производительность и управление памятью по сравнению с базовыми объектами данных Delphi.

Мы используем компоненты Devart и инструменты SQL, и они действительно стоят своих денег. веб-сайт Devart Data tools

person Jason Richards    schedule 04.04.2013
comment
Примечание для людей, которые ответили здесь: пожалуйста, проверьте заголовок вопроса и, пожалуйста, не говорите людям, как кодировать! Мне надоело находить ПЛОХИЕ ответы на ХОРОШИЕ вопросы при гуглении. Вот идеальный пример! Google отправит СЮДА миллионы людей, которые действительно хотели узнать разницу между двумя типами набора данных. Но они видят людей, рассказывающих, почему вы хотите это сделать? Я опубликую реальный ответ ниже. - person Simon; 06.04.2016