Wie kann ich eine schnell durchsuchbare Liste machen Java/

Hallo,

ich benötige eine schnell durchsuchbare Liste oder eine andere Alternative.

Ich benötige etwas wie eine HashMap welche ich nach Key UND Value durchsuchen kann. Dabei müßte der Value-Wert auch in Teilen zu durchsuchen sein (am besten mit regex).

Zur Zeit nutze ich- weil ich echt keinen Plan hab- einen String mit 2 Methoden. das ist aber nicht der Weisheit letzter Schluß.

Wichtig ist das die Größe nicht begrenzt ist und das die Liste im Arbeitsspeicher gehalten wird(Geschwindigkeit).

Ich freue mich auf alle Vorschläge… gern auch etwas abwegige

Hallo
ich bin leider auch noch Java-Anfänger.
Unter der Voraussetzung dass in der Liste keine Veränderungen und die Daten (Key und Value) Zeichenketten sind, würde ich auch alles in einen String einlesen und die Suche mit "s.indexOf(„Key“) durchführen.
Drück dir die Daumen, dass performantere Lösungen bekommst.
Gruß Michael

Wenn für die Suche der Key komplett bekannt ist, dann natürlich mit HashMap oder TreeMap arbeiten,
tabelle.get(sFrage);
und Value mit indexOf durchsuchen.

1 Like

das Java-Forum kennst sicher (https://www.java-forum.org)

1 Like

Der Key ist nicht komplett bekannt leider auch der Wert nicht.
Hier liegt genau mein Problem. Die String-Methode ist… naja.
Leider sind Hashmap und alle anderen Varianten (List…) usw. nicht geeignet da man diese nicht wirklich durchsuchen kann.Leider ist im JavaForum absolut nix zu finden. Ich bin seit über 10 Jahren Informatiker. Die alternative ist eine Neo4J Variante also Nosql über eine Key-Value Abstraktion bei der mit Graphen… aber das ist VIEL ZU HOCH gegriffen.

Wie ich oben schon angedeutet habe, habe ich in einer Anwendung einen String aufgebaut, jedes Element mit „|kkkk=vvvvv|“ eingebunden und dann mit indexOf durchsucht. Der String hat bei mir ca 55 MB und die Suchzeit ist passabel.

Wie schon in der Frage oben habe ich das schon in Betrieb…Mein Strin ist in Datei bereits über 1,2 Gb…

Eine DB geht übrigens nicht… kann nur eine Jar ohne alles nutzen…

Hallo,

habe meine Erfahrungen in anderen Sprachen, aber hier scheint mir die Frage zuerst nach den geeigneten Algorithmen und Datenstrukturen zu sein. Und da verstehe ich bei Deinen Anforderungen nur Bahnhof.

Denn die geeignete Struktur hängt sehr davon ab, was für Daten es sind, ob und wie häufig in der Suchliste Änderungen vorgenommen werden müssen und wonach gesucht werden muss.

Wenn Du in Deinen Anforderungen Hash und Regex in einem Satz verwendest, erscheint das doch etwas widersprüchlich.

Unscharf ist auch die Anforderung, dass die Größe unbegrenzt ist. Größe von was?

Mach einfach mal konkrete Anforderungen, die etwas mehr über Dein Problem aussagen.

Beispielsweise:
Du hast eine Liste von 5 Milliarden Einträgen mit zwei Schlüsseln zu 64 Byte und zu 4096 Byte und suchst alle exakten Treffer zu einem Schlüsselwert-Pärchen.

Ciao, Allesquatsch

Vielen Dank für deine Antwort.
Wie du schon richtig feststellest verstehst du nur Bahnhof und ich muss das etwas genauer ausführen(mein Fehler).

A: … Was für Daten es sind
Wie oben beschrieben Strings. Das ist eine Kette von Chars mit nicht definierter Länge ähnlich dem CText Format zumeist in der von System vorgegebenen Codierung( Z.B. UTF-8,…)

B:… Ob und wie häufig änderungen vorgenommen werden…
1/100.000 Read/Updats

C:… Wonachgesucht wird
Wie oben beschrieben Strings und deren Fragmente

D:… Hash vs. Regex sind Widersprüchlich…
Wie oben beschrieben habe ich KEINE Suche nach Hash vor sondern nutze eine HashMap. Dies ist eine Informatisch Standatiesiertes Verfahren zur Selektion und Revision von Daten zur Relationalitätswahrung. Einen Hash sucht man nicht mit regex, mit Teilen von Strings(Substrings) oder ähnlichem. Daher habe ich geschrieben „… Ich benötige etwas wie eine HashMap…“.

E:…die Größe begrenzt ist. Größe von was?
„…Wichtig ist das die Größe nicht begrenzt ist und das die Liste im Arbeitsspeicher gehalten wird(Geschwindigkeit)…“ Also von der Liste, HashMap oder was immer der Tip bringt.

F:…Mach einfach mal konkrete Anforderungen, die etwas mehr über Dein Problem aussagen…"
Hab ich gemacht… Aber egal. Gern mache ich das nochmal deutlicher:

…Ich habe ein Liste mit 1,75 Mrd Einträgen und einem Valuewert deren Länge auf String-Literale (Unbegrenzt) liegt. Ich suche einen Treffer innerhalb der Valus zumeist (1zu 176.000) nach Volltreffern und in wenigen (176.00 zu 1 ) Fällen nach Substrings am besten mit Manipulierbaren Sekundären Logikfiltern der Kategorie AzuG oder BzuG.

Die von mir genutzte Lösung ist zur Zeit in der Lage diese Anforderungen innerhalb von 12 MillSek zu erfüllen wobei hier die GPU (2 Grafikkarten -->HP NVIDIA Tesla K10 Rev B Dual GPU Computational Accelerator E5V47A) zur Berechnung genutzt wird. Leider wird dies mit der nächten Uhrladung wahrscheinlich zu langsam (Doppelte Datenmenge ca. 3 Mrd Dateneinträge) da ich Echtzeit (nahezu echtzeit) benötige.

Ich hoffe ich habe das jetzt etwas besser erklärt. Was ich suche ist eine Idee und keine fertige Lösung da sowas eh nicht existiert oder unbezahlbar wird.

Danke

Steig mal vllt. auch über ein paar Zeilen BspCode ein, dann wird es konkreter.