500万条字符串的高速处理(100)

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

huxhang

Unregistered / Unconfirmed
GUEST, unregistred user!
求代码:文本:sewBET:0,3,0,0,0,0,0,0,1,0,0,0,1,0dfhBET:0,1,0,0,0,0,0,1,3,0,3,0,3,3hPoker:0,0,0,0,0,0,3,0,3,0,3,0,0,0.....500万条左右。将以上冒号:后的数字与某串比如0,1,3,1,3,3,3,3,1,3,3,1,3,0对比,则得出500万条的每一条与edit1相同的数字的个数(逗号不计):[3]sewBET:0,0,0,0,0,1,0,1,3,0,0,0,1,0[3]dfhBET:0,0,0,0,0,0,3,1,3,0,3,0,3,3[4]hPoker:0,0,0,0,0,0,3,0,3,0,3,0,0,0.....(为了效率,最好用流来处理)
 
我觉得将你的字符串分成N块,然后采用多线程的方法,每个线程比较一块,这样应该比较快;
 
procedure TForm6.Button1Click(Sender: TObject);var SL: THashedStringList;begin SL := THashedStringList.Create
try SL.Add()
if SL.IndexOf() <> -1 then begin end else begin end;
finally SL.Free
end;end;
 
如果是试题,很容易啊。但如果是实际应用,还要考虑很多东西,例如,是否以后需要经常查找,执行频率有多高,数据是否定长,执行此功能的机器状况(是否服务器,cpu个数)。。。。等等
 
procedure TForm1.btn1Click(Sender: TObject);var I, J, K, D: Integer
Start: Integer
A: array of Integer
B: array of Integer
S, S1, S2: TStringList;begin Start := GetTickCount
S := TStringList.Create
SetLength(A ,14)
for I := 0 to 13 do begin A := 1
end
S1 := TStringList.Create
S1.Delimiter := ','
S2 := TStringList.Create
S2.Delimiter := ':'
S.LoadFromFile('D:/sadw.txt')
SetLength(B, S.Count)
D := 0
for I := 0 to S.Count -1 do begin S2.DelimitedText := S.Strings
S1.DelimitedText := S2.Strings[1]
K := 0
for J := 0 to S1.Count -1 do begin if S1.Strings[J] = IntToStr(A[J]) then Inc(K)
end
B := K
Inc(D)
end
S1.Clear
for I := 0 to Length(B) -1 do begin S1.Add(IntToStr(B))
end
S1.SaveToFile('D:/me.txt')
S1.Free
S2.Free
S.Free
ShowMessage(IntToStr(GetTickCount - Start) + ',' + IntToStr(D));end;一百万条记录的比较大概需要22秒
 
最后保存结果的方式可以自己写
 
> S.LoadFromFile('D:/sadw.txt');吃内存太厉害了[:D],内存不够的客户机就死掉了。
 
几十M而已现在内存都1,2G的
 
procedure TForm1.btn1Click(Sender: TObject);var I, K, J: Integer
F: TextFile
S: string
A, B: array of Integer
S1, S2: TStringList;begin AssignFile(F, 'D:/sadw.txt')
Reset(F)
SetLength(A ,14)
for I := 0 to 13 do begin A := 1
end
S1 := TStringList.Create
S2 := TStringList.Create
S1.Delimiter := ':'
S2.Delimiter := ';'
SetLength(B, 5000000)
K := 0
while not Eof(F) do begin Readln(F, S)
S1.DelimitedText := S
S2.DelimitedText := S1.Strings[1]
J := 0
for I := 0 to S2.Count -1 do begin if IntToStr(A) = S2.Strings then begin Inc(J)
end
end
B[K] := J
Inc(K)
end
S2.Free
S1.Free
CloseFile(F);end;
 
50万笔,两秒
 
搞错了一点 S2.Delimiter := ';';改为S2.Delimiter := ',';呵呵时间要慢一点,大概也是22秒左右
 
呵呵,测了8.8秒
 
导入数据库中
 
GodIsWrong,tstringlist可以用流来吧?但我不会
 
用流和不用留有区别吗,我后面那个程序师一行一行的获取,和用流完全类似
 
是不是这样的意思 Readln(F, S)
S1.DelimitedText := S
S2.DelimitedText := S1.Strings[1]
J := 0
for I := 0 to S2.Count -1 do begin if IntToStr(A) = S2.Strings then begin Inc(J)
end
end;这部分不用TStringListp:PChar = S;然后自己解析p里面的数据内容。
 
呵呵,如果是这样的话,就更没必要了,毕竟自己写过函数分割字符串和调用TstringList类的分割函数效率差不多,说不定自己写的还没有自带的效率高
 
我就没看出规律来,啥规律啊sewBET:0,3,0,0,0,0,0,0,1,0,0,0,1,0 0,1,3,1,3,3,3,3,1,3,3,1,3,0==>sewBET:0,0,0,0,0,1,0,1,3,0,0,0,1,0dfhBET:0,1,0,0,0,0,0,1,3,0,3,0,3,3 0,1,3,1,3,3,3,3,1,3,3,1,3,0==>dfhBET:0,0,0,0,0,0,3,1,3,0,3,0,3,3hPoker:0,0,0,0,0,0,3,0,3,0,3,0,0,0 0,1,3,1,3,3,3,3,1,3,3,1,3,0==>hPoker:0,0,0,0,0,0,3,0,3,0,3,0,0,0
 
后退
顶部