linsb进来一下,我有两个问题想问。谢谢。(60分)

  • 主题发起人 主题发起人 guguda
  • 开始时间 开始时间
G

guguda

Unregistered / Unconfirmed
GUEST, unregistred user!
NO.1 昨天的格式转换问题,我的文本数据量很大,200M多,用这个程序后就没有反映了。有什么方法可以解决这个问题?能不能边转换格式边存盘?
NO.2 用adoquery对两个表关联查询并显示到dbgrid里,我想删除其中的几条记录(在DBGRID里临时删除),但不是对数据库操作,请问要怎么做?听说要设缓存,但在那里设呢?
 
linsb??????
 
NO.1 没处理过这么大的文件,“没有反映了”,是什么意思?是死机还是系统在运算?
可只读入不作任何操作,结果如何?
NO.2 adoquery.cachedupdate:=true;
对库要索引,且删除操作后不要更新(否则真删除)。
 
1.只是让他读到程序里。运算一段时间后程序没有响应了。昨天在服务器(2 CPU,1G EMS MOMORY)上运行了一晚上,今天没结果!系统没问题,但程序没反应了。
2.adoquery有cachedupdate吗?在系统自己给出的选择里没有啊。只有一个cachesize。
如何对库索引?能写一个例子看一下吗?
 
NO.1 200M的文件需要很大的内存,而不是cpu。>>程序没反应是死机吗?
如不行,应考虑其他方法。
NO.2 我给出的不适于ado。
 
先不管NO.2的问题,说NO.1吧。
我服务器的内存是1G啊。这样都不能成功!不是死机,而是程序没响应。可就是说用ctrl+alt+del可以看到进程,系统说这个程序无响应。
计算机并未死机。
还有什么别的方法吗?
最好是能边读边写的方法,这样应该可以减少系统负荷。
 
首先要能读入,用Tstringlist是否能读入?(试试)
再试试数据文件:
procedure TForm1.Button1Click(Sender: TObject);
var
myfile:TextFile;
temp:string;
i;Longword;
begin
assignfile(myfile,'shuj.txt');//改为你自己的文件(含路径)
Reset(myfile);
i:=0;
while not SeekEof(MyFile) do
begin
i:=i+1;
readln(myFile,temp);
end;
showmessage(IntToStr(i));
CloseFile(myfile);
end;
记一下读入时间,和i数
如果能读,但要存确有另外问题。走一步看看。
 
将昨天给你的代码改一下试试:
i;Longword;
 
i=684635
如读,速度也还可以,15s左右。
然后还要怎么做?
 
试试:
procedure TForm1.Button1Click(Sender: TObject);
var
s: TStringList;
begin
s := TStringList.Create;
s.LoadFromFile('b.txt');
showmessage(IntToStr(s.count));
end;
记一下读入时间。
 
得数是1018788
用时是8分钟左右
然后要做什么?
 
对了,现在用的不是200多M的数据,是一个100M的。
 
看来100M可读入。
将昨天给你的代码改一下试试:
i;Longword;
因不知你的数据这么大,因此i:byte。
 
这是我的代码,是要这么改吗?
-------------------------------
procedure TForm1.ToolButton1Click(Sender: TObject);
var
i, j: Integer; //改动这里?
s: TStringList;
begin
s := TStringList.Create;
if opendialog1.Execute then
s.LoadFromFile(opendialog1.FileName);
i := 0;
while i < s.Count do begin
if length(trim(s))= 0 then
s.delete(i)
else if pos(',',s)= 0 then begin
j:=pos(',',s[i-1]);
s[i-1]:=copy(s[i-1],1,j)+copy(s[i-1],j+1,4)+'-'+copy(s[i-1],j+5,2)+'-'+copy(s[i-1],j+7,length(s[i-1])-j-6);
s[i-1]:=copy(s[i-1],1,j)+copy(s[i-1],j+1,24)+'-'+copy(s[i-1],j+25,2)+'-'+copy(s[i-1],j+27,length(s[i-1])-j-26);
s[i-1]:=s[i-1]+trim(s);
s.delete(i);
end
else
inc(i);
end;
s.SaveToFile('shuju.txt')
end;
 
好像出问题,但程序可以编译。
系统提示:
Comparing signed and unsigned types - widened both operands
这是什么意思?一共有三条这个错误。出别出现在:
while i < s.Count do begin
s[i-1]:=copy(s[i-1],1,j)+copy(s[i-1],j+1,4)+'-'+copy(s[i-1],j+5,2)+'-'+copy(s[i-1],j+7,length(s[i-1])-j-6);
s[i-1]:=copy(s[i-1],1,j)+copy(s[i-1],j+1,24)+'-'+copy(s[i-1],j+25,2)+'-'+copy(s[i-1],j+27,length(s[i-1])-j-26);
 
首先在实验数据调通程序,然后用实际数据测试,在出错地点设监控数据,分析错误产生原因。
遥控太费劲!
 
我用了一个小文件,转换成功。然后将100M的文件进行转换,但程序、仍然是运行一段时间后没有响应了。
上边提到的错误好像在程序编译成EXE文件运行后没什么影响,因为小文件在测试时可以转换。
 
估计程序没问题,还是内存的事。100M的文本文件已经不小了!
小文件不知多大?那么可计算100M所需的时间。可监控程序是否在运行,和运行到何处。
 
我先试试吧。把这个贴先结了。有问题再开一个新贴。
谢谢了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
930
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部