高手帮忙看看:上亿的数据从数据库中导出生成dat文件 ( 积分: 100 )

  • 主题发起人 主题发起人 hyperbrain
  • 开始时间 开始时间
H

hyperbrain

Unregistered / Unconfirmed
GUEST, unregistred user!
在要实现从ORACLE中导出数据生成*.dat文件,最大的一张表导出生成的文件已经达到6.7G,现在想用DELPHI实现,有两个问题:
1.如果用ADO连接数据库,如何打开如此大表的数据集;
2.从表中读出数据以什么方式写文件(最好提供代码,一年多没用过DELPHI了);
 
数据量太大了,如果一定要用delphi实现可参考这个:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
 
仔细看了
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966 的确不错,但问题可能比想象的更难,因为我要取出每条记录在中间加"|"分隔符.
 
刚在SQL SERVER中测试了一下,生成一个60MB的文件(40万记录),大约花了3分30秒,但打开数据集的时间估计花了2分钟.
 
procedure TForm1.Button1Click(Sender: TObject);
var
loList: TStringList;
i, j: Integer;
lsFieldStr: String;
loDt1, loDt2: TDateTime;
begin
j := 0;
ProgressBar1.Min := 0;
if not AQry_BD.Active then AQry_BD.Open;
loDt1 := Now;
ProgressBar1.Max := AQry_BD.RecordCount;
loList := TStringList.Create;
try
AQry_BD.First;
AQry_BD.DisableControls;
while not AQry_BD.Eof do
begin
lsFieldStr := '';
for i := 0 to AQry_BD.FieldCount - 1 do
begin
lsFieldStr := lsFieldStr + Trim(AQry_BD.Fields.AsString) + '|';
end;
loList.Add(lsFieldStr);
j := j + 1;
ProgressBar1.Position := j;
AQry_BD.Next;
end;
AQry_BD.EnableControls;
loList.SaveToFile('DemoFile.dat');
loDt2 := Now;

ShowMessage('数据导出时间为:' + DateTimeToStr(loDt1 - loDt2));
finally
loList.Free;
end;
end;
我现在是通过TStringList导出,发现直写文件更慢,不知TStringList能不能支持上亿条记录.
 
TStringList,6G多数据肯定不行,每个进程从系统得到的内存是4G,TStringList是在堆中分配内存的,肯定会出现内存不足错误。
您应该创建一个文本文件,然后不停的追加记录。
这么大数据,速度肯定快不起来的,你复制,粘贴试试就知道了。磁盘的读写瓶颈在那摆在呢。
 
后退
顶部