3 Stimmen

Was ist der effizienteste Weg zur Implementierung einer Tabelle, die spärliche Daten in C# speichert?

Ich habe eine DataTable, die sehr spärliche Daten speichert, etwas wie:

   P1 P2 P3 P4 P5 ...
J1 1  1
J2    1  1
J3             1
.
.
.

Die Anzahl der Zeilen und Spalten kann über 10^8 betragen.

Wie kann ich diese Daten auf effizientere Weise speichern?

0 Stimmen

Speichern Sie nur 1en oder auch andere Daten, und wie müssen Sie die Daten anschließend abrufen? Aggregation, direktes Nachschlagen?

0 Stimmen

Welche Art von Dichte wird erwartet? Es scheint sich um eine große Matrix mit Werten entlang der Diagonalen zu handeln? Kann sie für einen Spezialfall optimiert werden (ist sie z. B. gelöst?) oder muss sie allgemein genug für eine "nicht spärliche" Matrix bleiben?

2voto

Mikael Svenson Punkte 37911

Wenn Ihr Plattendateisystem Folgendes unterstützt Spärliche Dateien können Sie eine leere Datei erstellen, sie als spärlich markieren und dann die Größe auf rows * colums * datasize .

Dann geht es darum, auf die Daten nach [Zeile][Spalte] zuzugreifen, wobei der Versatz mit berechnet werden kann:

offset = ((columns.length * (row-1)) + column) * datasize

Es gibt einen gewissen Overhead mit spärlichen Dateien auch in Bezug auf die Zuordnung, wo es in der Regel zugewiesen Seiten von 16-64kb, aber je nachdem, wie Ihre Daten-Cluster könnte es sehr gut funktionieren.

0voto

Florian Reischl Punkte 3738

Entfernen Sie zunächst die DataTable für diese Zählungen von Daten. Sein Speicherverbrauch ist hier viel zu groß.

Wenn Ihre Daten immer 0/1 sind, sollte die effizienteste Methode eine Bitmaske sein.

Wenn Ihre Daten nicht nur 0/1 sind, erstellen Sie eine Struktur, die alle Ihre Spalten abstrahiert.

Hier ist ein konzeptioneller Prototyp dieser Datenstruktur.

class MyData {
    public MyData(int[] columns, object[] data) {
        _columns = columns;
        _data = data;
    }

    int[] _columns;
    object[] _data;

    public object this[int column] {
        get {
            int index = IndexOf(column);
            return index != -1 ? _data[index] : null;
        }
    }

    private int IndexOf(int column) {
        for (int i = 0; i < _columns.Length; i++)
            if (_columns[i] == column)
                return i;
        return -1;
    }
}

Sie könnten zusätzlich den Speicher für die _columns sparen, indem Sie das Flyweight-Muster anwenden.

Ich hoffe, das hilft

0voto

Thomas Bratt Punkte 43640

Es gibt eine Vielzahl von Stand der Technik bei der effizienten Speicherung von Ersatzmatrizen.

Ein gängiger Ansatz ist die so genannte "Liste der Listen". Python bietet zum Beispiel eine speichereffiziente Methode zum Speichern von Ersatzmatrizen als ' Zeilenbasierte verkettete Liste sparse matrix '.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X