2012-04-08 4 views
1

Ich muss große Datentabelle mit etwa 10 Millionen Zeilen und mehreren Spalten speichern. Was ich tun muss, kann wie folgt zusammengefasst werden:Wie kann man Matrix- oder Tabellen-ähnliche Daten in Java speichern und effizient von ihnen abrufen?

1. Basierend auf den Werten in den Spalten muss ich einige der Zeilen auswählen.

Beispiel:

Zeile 500: | 10 | 3 | 4 | 5 | 100 | 314 | 45 |

Zeile 501: | 13 | 5 | 7 | 4 | 160 | 210 | 40 |

Zeile 501: | 24 | 3 | 8 | 6 | 260 | 810 | 50 |

Zeile 602: | 34 | 7 | 9 | 6 | 350 | 760 | 10 |

Hier kann der erste Spaltenwert als Zeilen-ID betrachtet werden. Hier sind die IDs 10,13,24,34

Angenommen, ich suche nach den Zeilen, die Wert> = 5 in ihrer 4. Spalte haben. Also, nach der Filterung der Ausgabe wird:

Zeile 500: | 10 | 3 | 4 | 5 | 100 | 314 | 45 |

Zeile 501: | 24 | 3 | 8 | 6 | 260 | 810 | 50 |

Zeile 602: | 34 | 7 | 9 | 6 | 350 | 760 | 10 |

2. Im zweiten Schritt muss ich sie spaltenweise vergleichen. Angenommen, Zeile 500 hat in ihrer 2. und 3. Spalte Werte 3 bzw. 4, die ebenfalls in den Bereich (3-8) fallen. Aber dieser Bereich fällt nicht mit (7-9)

So gibt es eine Beziehung zwischen Zeile 500 und Zeile 501. Und die Ausgabe wird sein:

3.Suppose ich bin den Wert gegeben 10. Dann muß ich Reihe mit 10 in seiner ersten Spalte und verringert den Wert in der 7. Spalte 5. So die Reihe nun aussehen wird, finden:

Reihe 500: | 10 | 3 | 4 | 5 | 100 | 314 | |

Ich war bisher Matlab für diese Operationen mit Matlab-Bibliothek Funktionen sehr einfach. Allerdings muss ich den gesamten Code in Java konvertieren. Eine Möglichkeit besteht darin, große Arrays zu verwenden und for-Schleifen für den Zugriff auf jede Zeile zu verwenden. Wird es für solch ein großes Array effizient sein? Bitte helfen Sie mir in dieser Hinsicht.

+0

Ehrlich gesagt, wäre der beste Weg, mit einer so großen Datenmenge umzugehen, die Verwendung einer geeigneten Datenbank. Es wird das Suchen und Filtern so viel einfacher machen. Gibt es eine Chance, dass Sie eine richtige DB verwenden können? –

+0

Ja, sicherlich kann ich DB benutzen. Ich habe allerdings schon ziemlich lange mit Datenbanken gearbeitet. Ich muss das Ganze innerhalb kürzester Zeit (maximal 2 Tage) einarbeiten. Also, ich bin verwirrt, ob ich in der Lage wäre, das Fachwissen wiederzugewinnen oder nicht. –

Antwort

3

Erstens würde ich vorschlagen, einen im Speicher RDBS wie SQLLite, HyperSQL Verwendung JavaDB

Danach dann Sie einen Blick auf Table in Googles Guave Bibliothek nehmen können.

Zeilenbasierte Lookups sind am schnellsten mit HashBasedTable und TreeBasedTable, aber Sie können ArrayTable betrachten, da es so aussieht, als wären Ihre Daten nicht spärlich.

Schließlich, werfen Sie einen Blick auf this question.

1

Nun, ich werde versuchen, Ihre Bedürfnisse zu definieren und basierend auf ihnen werde ich die entsprechende Datenstruktur geben. 1- Sie benötigen einen schnellen Zugriff auf die Elemente. basierend darauf vermeiden Sie LinkedList und verwenden Sie entweder ArrayList oder statische Array. 2- Da Ihre Daten groß sind, empfehle ich, dass Sie sie nicht alle im Hauptspeicher laden (dynamisches Laden)

Hinweis: Es gibt erweiterte Möglichkeiten, Ihren Zugriff zu optimieren, indem Sie B + Baum verwenden, aber ich möchte nicht gehen Deeper versuchen, was ich oben sagte, und ich glaube nicht, dass Sie es mehr optimieren müssen (wenn Sie das dynamische Laden korrekt und effizient implementieren).

Verwandte Themen