Der Versuch, alle möglich zu erzeugen zieht (Kombinationen) für eine Lotterie mit einzigartigen 6 von 42C#/VB .NET Performance-Tuning, generieren alle möglichen Kombinationen Lottery
Eigentlich für die effizienteste Weg, um dies zu tun (damit die eigentliche Generation keine Tage braucht).
Abgesehen von der Verarbeitung HOG (was zu erwarten ist). Ich bin in einem Speicher Einschränkung Problem .. wo meine Maschine von 12 GB Ram kann nicht 10% der Menge auf Nummer, geschweige denn alle Combos halten.
Also entschied ich mich, in eine Datenbankalternative zu schauen. Aber damit habe ich das Problem der Duplikate (da ich nicht die ganze Liste im Speicher habe, um auf Existenz zu prüfen).
Ich habe viele Code-Versionen ausprobiert, aber alle sind ressourcenintensiv. beschäftigt
Aktuell Suche nach Alternativen, die wirklich funktionieren :)
Hier ist mein letztes Codebeispiel, das eine Datenbank für die spätere Satzverarbeitung und -filterung und Vervielfältigung Entfernung: i Feuer
public List<Draw> getDrawsContaining(List<int> initialBalls)
{
if (initialBalls == null)
initialBalls = new List<int>();
if (initialBalls.Count >= 6)
return new List<Draw> { new Draw(initialBalls) };
List<Draw> toReturn = new List<Draw>();
for (int i = 1; i <= 42; i++)
{
if (initialBalls.IndexOf(i) != -1)
continue;
initialBalls.Add(i);
toReturn.AddRange(getDrawsContaining(initialBalls));
initialBalls.Remove(i);
}
return toReturn;//.Distinct(dc).ToList();
}
und sagen, in den Page_Load dies:
try
{
using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
connection.Open();
String query = "TRUNCATE TABLE Draws";
SqlCommand command = new SqlCommand(query, connection);
//command.Parameters.Add("@id", "abc");
command.ExecuteNonQuery();
connection.Close();
}
DataTable dt = new DataTable("Draws");
dt.Columns.Add("Ball1");
dt.Columns.Add("Ball2");
dt.Columns.Add("Ball3");
dt.Columns.Add("Ball4");
dt.Columns.Add("Ball5");
dt.Columns.Add("Ball6");
for (int j = 1, k = 1; j <= 42 && k <= 42;)
{
List<Draw> drawsPart = getDrawsContaining(new List<int> { j, k });
if (drawsPart.Count > 0)
{
foreach (Draw d in drawsPart)
{
d.Balls.OrderBy(c => c);
DataRow dr = dt.NewRow();
dr["Ball1"] = d.Balls[0];
dr["Ball2"] = d.Balls[1];
dr["Ball3"] = d.Balls[2];
dr["Ball4"] = d.Balls[3];
dr["Ball5"] = d.Balls[4];
dr["Ball6"] = d.Balls[5];
dt.Rows.Add(dr);
}
DataTable tmp = dt.Copy();
dt.Rows.Clear();
AsyncDBSave AsyncDBSaveInstance = new AsyncDBSave(tmp, AsyncDBSaveDispose);
Thread t = new Thread(new ThreadStart(AsyncDBSaveInstance.commit));
t.Start();
}
k++;
if (k == 43) { j++; k = 1; }
}
}
catch (Exception ex)
{
var v = ex.Message;
throw;
}
Sie sind nicht eine Datenbank überhaupt verwendet wird. Sie machen die gleichen Berechnungen wie zuvor langsamer und speichern sie immer noch im Speicher. Irgendwann versuchen Sie, sie an eine Datenbank anstelle einer Datei zu senden. Wenn Sie eine Datenbank verwenden, verwenden Sie SQL, um die Arbeit zu erledigen, behandeln Sie die Datenbank nicht als eine flache Datei. –
'Aber damit habe ich das Problem der Duplikate' .... Wie erhalten Sie Duplikate, Generieren aller Kombinationen, wenn es richtig gemacht wird sollte nicht geben Sie irgendwelche Duplikate oO – Sidewinder94
Die Zahlen zu berechnen und sie zB in einer Datei zu speichern, ist nicht so ein großes Problem, obwohl die Verwendung eines einzelnen Threads dafür viel Zeit in Anspruch nimmt. Was wirst du mit ihnen machen? Es macht keinen Sinn, sie in einer Datenbank zu speichern, wenn Sie nicht nach einzelnen Kombinationen * suchen * wollen. Wenn Sie suchen möchten, warum speichern Sie * alle * von ihnen statt nur die interessanten? –