Hallo Communnity,
ich hab mal wieder ein Problem.
Wir haben vor die Gewinner einer Verlosung per Zufallsgenerator zu ermitteln. (Haha, kein Problem)
Jetzt soll aber eine Gewichtung mit einfließen. Und zwar soll sich für jeden Euro(€) Einzahlung auf's Konto die Gewinnchance um 1 erhöhen.
Damit es nicht so einfach ist, mal ein paar Randdaten:
- ca. 150000 Kunden
- Einlagen zwischen 1€ & 1000000€
Hier mal mein Code der zwar funktioniert, aber nur wenn ich die Summen um den Faktor 100 dividiere.
Delphi-Quellcode:
Randomize;
srcFile := TStringStream.Create;
srcStrings := TStringList.Create;
randList := TStringList.Create;
try
WriteLn('Lade Quelle ...');
srcFile.LoadFromFile('source.csv');
srcStrings.LoadFromStream(srcFile);
WriteLn('Erstelle Zufallsliste nach Gewichtung ...');
for I := 0 to srcStrings.Count - 1 do
begin
Write(#13, Format('[%d%%]', [(100 * I) div srcStrings.Count]));
for J := 1 to srcStrings.Count - 1 do
begin
randList.Add(Explode(srcStrings.Strings[I], ';', 1));
end;
end;
WriteLn;
for I := 0 to 9 do
WriteLn('Gewinner: ' + randList.Strings[Random(randList.Count)]);
ReadLn;
finally
FreeAndNil(srcFile);
srcStrings.Free;
randList.Free;
end;
Mit den gekürzten Summen, habe ich allerdings schon eine Speicherbelegung von mehr als 6GB und es wird ausgelagert.
Versuche ich das ganze mit den Originaldaten, friert mein System nach etwa 30 Sekunden ein und ... ich brauch' gar nicht weiter reden.
Also, über eure Hilfe wie ich diese Daten vernünftig verarbeiten kann wäre ich echt dankbar.
Ach so, die Funktion "Explode" holt mir die Komma-Separierten Daten aus der
CSV (Kunde;Summe [oder auch Gewichtung]).
Gruß
Stefan