diesen Code Gegeben:OutOfMemory Ausnahme für Liste der POCOs
public class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
public List<Qualification> Qualifications { get; set; }
}
public class Qualification
{
public QualificationType QualificationType { get; set; }
public decimal Value { get; set; }
}
public class Action
{
public ActionID { get; set; }
public int CustomerID { get; set; }
public decimal ActionValue { get; set; }
}
public class Service : IService
{
public List<Customer> ProcessCustomers()
{
List<Customer> customers = _customerService.GetCustomers(); // 250,000 Customers
List<Action> actions = _actionService.GetActions(); // 6,000
foreach (var action in actions) {
foreach (affectedCustomer in customers.Where(x => x.CustomerID < action.CustomerID)) {
affectedCustomer.Qualifications.Add(new Qualification { QualificationType = QualificationType.Normal, Value = action.ActionValue});
}
foreach (affectedCustomer in customers.Where (x => SpecialRules(x))) {
affectedCustomer.Qualifications.Add(new Qualification { QualificationType = QualificationType.Special, Value = action.ActionValue});
}
}
}
}
Der "Most Qualified" Kunde mit 12.000 Qualifikationen kann am Ende. Durchschnittlich können Kunden ~ 100 Qualifikationen erhalten.
Aber ich bekomme sehr früh ein OOME, nachdem ca. 50 Aktionen bearbeitet wurden. Zu diesem Zeitpunkt hat meine Liste noch immer nur 250.000 Kunden, aber es wurden etwa 5.000.000 Qualifikationen in die Kunden aufgenommen.
Ist das viel? Scheint mir ein wenig berauschend. Ich vermutete, dass ich Dutzende von Millionen von Kunden haben könnte, und jeder hat einen Durchschnitt von 1000 Qualifikationen und ist immer noch in Ordnung. Ich bin noch nicht einmal nah dran.
Was kann ich im Code tun, um das effizienter zu machen? Mir ist klar, dass ich die Ergebnisse jeder (oder mehrerer Gruppen) von Aktionen in eine Datenbank schreiben kann, aber ich möchte lieber so viel wie möglich im Speicher speichern, bevor ich die Ergebnisse schreibe.
Durchläuft die 6.000 Aktionen und fügt für jede Aktion Qualifikationen für eine variable Anzahl von Kunden hinzu. Für jede Aktion wird allen Kunden mit einer customerID> = dem aktionskausalen Kunden eine Qualifizierung hinzugefügt. Das sind also 1,2 Milliarden hinzugefügte Datensätze. Für jede Aktion erhalten 8-10 Kunden eine Qualifikation. Eine winzige 60.000 Datensätze im Vergleich zu den 1,2 Milliarden.
Ich habe versucht, dies im Speicher zu tun, weil ich Milliarden von Datensatzeinsätzen in eine DB nicht tun will. Ich benötige diese Datensatztrennung für den nächsten Verarbeitungsschritt, der die Kundenqualifikationen und die Unterschiede in den Schritten der CustomerIDs von oben nach unten betrachtet. Obwohl ich letztendlich Ergebnisse (komplexer als SUMs) in die Datenbank bringe. Aber ich kann diese Ergebnisse nur erreichen, wenn ich die Unterschiede in den einzelnen Qualifikationen, wie die Einstufung auf einer Kurve, betrachte.
Ich würde gerne helfen, wenn Sie mir sagen, was Ihr Code tun soll :) –
@EyalPerry Ich fügte hinzu, was das Ziel ist. – Suamere