一个程序循环读取某个文件夹下的文件(一万多个文件),对每个文件和数据表的内容进行比较,数据符合再插入到另外一个表中.
//循环读取某个文件夹下的文件
allfile:=tstringlist.Create;
if findfirst('d:\file\*.*',not faDirectory,findresult)=0 then
begin
allfile.Add('d:\file\'+findresult.name);
while findnext(findresult)=0 do
begin
allfile.Add('d:\file\'+findresult.name);
end;
findclose(findresult);
end;
count:=allvod.Count; //count约为15000
for i:=0 to count-1 do
begin
//从表table1中查找是否存在文件夹中的文件
filename:=extractfilename(allfile.Strings[i]);
temp.SQL.Clear;
temp.SQL.Add('select * from tabel1 where f_name=:f_name1');
temp.ParamByName('f_name1').AsString:=filename;
temp.Open; //如果找到一条满足要求的记录则写入到表table2中
if temp.RecordCount=1 then
begin
qsql:='insert into table2(no,name,f_name) values(';
qsql:=qsql+temp.fieldbyname('no').AsString+',';
qsql:=qsql+ QuotedStr(temp.fieldbyname('name').AsString)+',';
qsql:=qsql+QuotedStr(allfile.Strings[i])+',';
inserttemp.SQL.Clear;
inserttemp.SQL.Add(qsql);
inserttemp.ExecSQL;
end;
end;这个过程需用30-40分钟,怎样才能提高效率?
//循环读取某个文件夹下的文件
allfile:=tstringlist.Create;
if findfirst('d:\file\*.*',not faDirectory,findresult)=0 then
begin
allfile.Add('d:\file\'+findresult.name);
while findnext(findresult)=0 do
begin
allfile.Add('d:\file\'+findresult.name);
end;
findclose(findresult);
end;
count:=allvod.Count; //count约为15000
for i:=0 to count-1 do
begin
//从表table1中查找是否存在文件夹中的文件
filename:=extractfilename(allfile.Strings[i]);
temp.SQL.Clear;
temp.SQL.Add('select * from tabel1 where f_name=:f_name1');
temp.ParamByName('f_name1').AsString:=filename;
temp.Open; //如果找到一条满足要求的记录则写入到表table2中
if temp.RecordCount=1 then
begin
qsql:='insert into table2(no,name,f_name) values(';
qsql:=qsql+temp.fieldbyname('no').AsString+',';
qsql:=qsql+ QuotedStr(temp.fieldbyname('name').AsString)+',';
qsql:=qsql+QuotedStr(allfile.Strings[i])+',';
inserttemp.SQL.Clear;
inserttemp.SQL.Add(qsql);
inserttemp.ExecSQL;
end;
end;这个过程需用30-40分钟,怎样才能提高效率?
把select中的数据一次读入到本地内存中(建一个本地的缓存变量,如数组、列表等)
每次在本地比较数据再插入数据库建议二:
把select和insert都写入存储过程,放在服务器上执行,
同时合理调整select表的关键字、索引,加快检索的速度
insert也可以采用一些加快插入速度的处理方法
如:先去掉关键字、索引,在全部加入完成后在加上关键字和索引等
for i:=0 to count-1 do
begin
//从表table1中查找是否存在文件夹中的文件
filename:=extractfilename(allfile.Strings[i]);
temp.SQL.Clear;
temp.SQL.Add('select * from tabel1 where f_name=:f_name1');
temp.ParamByName('f_name1').AsString:=filename;
temp.Open;
-------------------------------------
不要使用Sql来查询,一次把所有的记录都查出来,放到Table或者Query中,
然后使用Query中的方法来匹配记录,这样应该会快很多的。匹配记录时,可以
设置Query.DisabledControls,整个记录匹配完毕时,再恢复。
-------------------------------------
//如果找到一条满足要求的记录则写入到表table2中
if temp.RecordCount=1 then
begin
qsql:='insert into table2(no,name,f_name) values(';
qsql:=qsql+temp.fieldbyname('no').AsString+',';
qsql:=qsql+ QuotedStr(temp.fieldbyname('name').AsString)+',';
qsql:=qsql+QuotedStr(allfile.Strings[i])+',';
inserttemp.SQL.Clear;
inserttemp.SQL.Add(qsql);
inserttemp.ExecSQL;
end;
-------------------------------------
这儿也不要找到一条加一条,找到后,生成insert语句,先放置在另一个TStringList中,
等到有一定的数量(例如达到100条)再递交,其他结束时递交。