多线程查找大数据重复值问题 (200分)

  • 主题发起人 主题发起人 lovesoft
  • 开始时间 开始时间
L

lovesoft

Unregistered / Unconfirmed
GUEST, unregistred user!
初学delphi遇到一个数据查找问题
TStrings里面装着120多W条的数据,要查找出里面重复的数据,找出的重复数据里面
不能再有重复的数据。
如果用一般的单线程查找的速度太慢了。现在想用多线程分匹查找提高数度,
希望高手能给于提示,用什么方法或算法提高查找速度。谢谢
 
晕,TStrings里面装着120多W条的数据
 
可以。还能保存成文件。有20M
 
我也遇到,如果用双重循环,必死无疑,
于是我就把他bulk insert 到Sqlserver中去了
然后select distinct
然后用Datapump,速度还停快的
不过有人搞得也停快,不知道怎么搞,那就是ultral Edit32 我的有70用了5秒就搞定了,真是神道
 
后来看到过一篇英文,说是要建索引,然后用折半查找,由于我的任务已成,所以没试,如果你原意试,试成功了一定给一分代码给我
这个问题该置顶讨论,非常水准的,谁解决我也可以开贴再给300分,不过不能像我只说思路,要完整的源代码哦!!![:D]
 
和我一样先导入数据库。再清理。不过太累了,希望有高手能解决
 
没有说不行,我只是在想为什么不用数据库来做???
 
不用数据库的理由有很多?
1)不想:不知道原理,不求甚解
2)有时网络会成为问题,我遇到就是这个问题
 
不是每个人都会用数据库的。。如果自己能做不是更好
 
试试以下代码
你把120多W条的数据给我,我帮你测试一下:QQ:8486671
Var S1,:TSTrings;I,J:Integer;
begin
S1:=TStringList.Create;
Try
S1.LoadFromFile('XX.txt');
I := 1;
J := S1.Count - 1;
NewS := S1.Strings[0];
while I < Jdo
begin
if S1.Strings = NewS then
begin
S1.Delete(I);
Dec(J);
end
else
begin
NewS := S1.Strings;
Inc(I);
end;
end;
Finally
S1.Free;
end;
end;
数据12000条,文件54K 用时 0.266秒
数据120000条,文件711K 用时 124.75秒
数据120000条,文件8012K 用时 9499.75秒


 
120W就要快三个小时了,真受不了,你竟然还试,搞不好要循环几百亿次的,交给银河还差不多,这个方法不行啊,你要做到70万用不到三秒就行了,因为:UE就能做到
 
变态高手。
120W 的记录。
 
1Fuyi你的代码象只是在S1.Strings和S1.Strings[I+1]在比较根本重复值找不出来
 
巳收到楼主发来的数据
以下是测试结果:
第一次:1262372
用 时:29.141秒
第二次:1262372
用 时28.469秒
第三次:1262372
用 时:30.766秒
处理后的数据还有:1262369条
由于重得数据极少(仅3条),所以执行Delete(I)不多,用时便少多了

而我自己随机生成的测试数据有90%重复数据
所以执行时间大多用在Delete上(约要删除1100000条记录)
所以1200000数据用了近两个小时零40分钟
 
To Lovesoft
能不能删除重复数据,你自己写一个测试程序来试试
代码中只是要把以下语句改为:
while I < Jdo
begin
改为:
while I <= Jdo
begin
要不然,最后一个重复值不能检测到

 
通过这一个例子,我们可以认识到,
TStrings有足够大的处理能...
 
初步看了一下,你的是不是要求原文是有顺序的???
 
//源程序如下,含测试程序
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IniFiles;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);//进行重复数据删除
procedure Button2Click(Sender: TObject);//生成测试数据
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
H1: TStringList;
STime: Integer;//计时
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Times: Integer;//数据量
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var I, J: Integer;
NewS: string;
begin
H1.LoadFromFile('d:/2.txt');
Memo1.Lines.Add(IntToStr(H1.Count - 1));
STime := GetTickCount;
I := 1;
J := H1.Count - 1;
H1.Sort ;
NewS := H1.Strings[0];
while I <= Jdo
begin
if H1.Strings = NewS then
begin
H1.Delete(I);
Dec(J);
end
else
begin
NewS := H1.Strings;
Inc(I);
end;
end;
Memo1.Lines.Add(IntToStr(GetTickCount - STime));
H1.SaveToFile('D:/3.Txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
var I: Integer;
begin
Times := StrToInt(Edit1.Text);//根据输入确定数据量
H1.Clear;
STime := GetTickCount;
for I := 0 to Timesdo
H1.Add(IntToStr(Random(Round(Times ))));
H1.SaveToFile('D:/2.Txt');
Memo1.Lines.Add(IntToStr(GetTickCount - STime));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
H1 := TStringList.Create;
Randomize;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
H1.Free;
end;

end.
 
在数据库中找比较快
 
你新建一个工程
放两个Button一个Memo和一个Edit就可以测试了
 
后退
顶部