我使用TIBDataSet
來使用Delphi 2007從Firebird數據庫表中獲取記錄。該表中有大約100萬條記錄,並且我得到了Out of memory
錯誤。但是,TClientDataset
正確的查詢運行正常。TDataSet和TClientDataset內存管理有什麼區別?
請問關於內存管理的TClientDataset
和TDataSet
之間的區別?
我使用TIBDataSet
來使用Delphi 2007從Firebird數據庫表中獲取記錄。該表中有大約100萬條記錄,並且我得到了Out of memory
錯誤。但是,TClientDataset
正確的查詢運行正常。TDataSet和TClientDataset內存管理有什麼區別?
請問關於內存管理的TClientDataset
和TDataSet
之間的區別?
@alzaimar有一點,在32位平臺上加載到內存中的數百萬條記錄會成爲一個挑戰,無論您使用哪個數據集組件。
因此,盒子上的記憶是至關重要的。
我們用Delphi 2006編寫的應用程序做類似的事情。我們所做的是在Windows7 64位或服務器2008 64位上運行它們。
利用OS和其他應用程序的額外內存。
嘗試The best memory manager for Delphi
也把{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}在尤爾項目獲得高達4GB出32位德爾福的在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 website
人們的注意事項誰在這裏回答:請檢查問題的標題,並請不要告訴人們如何編碼!在使用Google搜索時,我對無聊的問題感到無聊。 這是一個完美的例子!谷歌將向這裏的數百萬人發送真正想知道這兩種數據集之間差異的信息。但是他們看到人們在說「你爲什麼要這麼做?」。我會在下面發表真實的答案。 – Simon
我不知道它們之間究竟有什麼區別,但是IIRC在TIBDataset中的內存不足問題可以通過將'Unidirectional'屬性設置爲true來解決。請注意,這會改變數據集的行爲方式,因此可能不適合您的情況。 –
通常,當我讀到有人讀取1個Mio記錄時,他的設計通常是錯誤的。通常有更好的方法來解決你的問題。 – alzaimar
我明白了@alzaimar的評論另一方面:閱讀百萬條記錄不應該使數據訪問層崩潰。 –