Java - Custom Hash Map / Tabelle Einige Punkte

In einigen früheren Beiträgen habe ich einige Fragen zum Codieren von Custom Hash Map / Table in Java gestellt. Da ich es jetzt nicht lösen kann und möglicherweise vergessen habe, richtig zu erwähnen, was ich wirklich will, fasse ich alle zusammen, um es klar und präzise zu machen.

Was ich tun werde:

Ich versuche, einen Code für unseren Server zu erstellen, in dem ich den Zugriffstyp des Benutzers anhand der URL ermitteln muss.

Jetzt habe ich ungefähr 1110 Millionen URLs.

Also, was wir getan haben,

1) Aufteilung der Datenbank auf 10 Teile von jeweils 110 Millionen URLs. 2) Erstellen einer HashMap mit einem parallelen Array, dessen Schlüssel der eine Teil der URL (dargestellt als LONG) und dessen Werte der andere Teil der URL (dargestellt als INT) sind -Schlüssel kann mehrere Werte haben.

3) Durchsuchen Sie dann die HashMap nach einigen anderen URLs (Millionen von URLs, die an einem Tag gespeichert wurden) pro Tag zu Beginn des Systemstarts.

Was Sie versucht haben:

1) Ich habe viele NoSQL-Datenbanken ausprobiert, aber wir fanden es für unseren Zweck nicht so gut.

2) Ich habe unsere gebautbenutzerdefinierte Hashmap(mit zwei parallelen Arrays) für diesen Zweck.

Worum geht es also?

Wenn das System startet, müssen wir unsere Hash-Tabelle jeder Datenbank laden und nach Millionen von URLs suchen:

Nun ist das Problem,

1) Obwohl die HashTable-Leistung recht gut ist, dauert der Code beim Laden von HashTable länger (wir verwenden File Channel & Memory Mapped Buffer, um ihn zu laden. Das Laden von HashTable dauert 20 Sekunden - 220 Millionen Einträge - da der Ladefaktor 0,5 beträgt.wir fanden es am schnellsten)

Also verbringen wir Zeit: (HashTable Load + HashTable Search) * Anzahl der DB = (5 + 20) * 10 = 250 Sekunden. Was für uns recht teuer ist und die meiste Zeit (200 von 250 Sekunden) zum Laden von Hashtabellen verwendet wird.

Haben Sie anders gedacht:

Ein Weg kann sein:

Machen Sie sich keine Gedanken über das Laden und Speichern und überlassen Sie das Cachen dem Betriebssystem mithilfe eines Puffers mit Speicherzuordnung. Da ich aber nach Millionen von Schlüsseln suchen muss, ist die Leistung schlechter als oben.

Da die Leistung von HashTable gut ist, die Ladezeit jedoch hoch ist, haben wir uns vorgenommen, die Leistung auf eine andere Weise zu reduzieren:

1) Erstellen Sie ein Array von verknüpften Listen der Größe Integer_MAX (meine eigene benutzerdefinierte verknüpfte Liste).

2) Fügen Sie Werte (int) in die verknüpften Listen ein, deren Nummer die Schlüsselnummer ist (wir reduzieren die Schlüsselgröße auf INT).

3) Wir müssen also nur die verknüpften Listen auf den Datenträgern speichern.

Nun, das Problem ist, es braucht viel Zeit, um eine solche Menge verknüpfter Listen zu erstellen, und die Erstellung einer solch großen Menge verknüpfter Listen hat keine Bedeutung, wenn die Daten nicht gut verteilt sind.

Also, was ist Ihre Anforderungen:

Einfach meine Anforderungen:

1) Schlüssel mit Einfügen und Suchen mehrerer Werte. Auf der Suche nach einer guten Suchleistung. 2) Schneller Weg (speziell) in den Speicher zu laden.

(Schlüssel sind 64-Bit-INT und Werte sind 32-Bit-INT, ein Schlüssel kann höchstens 2-3 Werte haben. Wir können unseren Schlüssel auch 32-Bit machen, geben aber mehr Kollisionen, aber für uns akzeptabel, wenn wir es besser machen können.) .

Kann mir jemand helfen, wie man das löst oder einen Kommentar, wie man das Problem löst?

Vielen Dank.

NB:

1) Gemäß den vorherigen Vorschlägen für Stack Overflow ist das Vorlesen von Daten für das Zwischenspeichern von Datenträgern nicht möglich, da unsere Anwendung beim Systemstart und am nächsten Tag beim Systemstart funktioniert.

2) Wir haben nicht festgestellt, dass NoSQL-Datenbanken gut skaliert sind, da unsere Anforderungen einfach sind (dh Sie müssen nur einen Hashtable-Schlüsselwert einfügen und laden und suchen (Werte abrufen)).

3) Da unsere Anwendung Teil eines kleinen Projekts ist und auf einem kleinen Campus angewendet werden soll, glaube ich nicht, dass mir jemand eine SSD-Disk dafür kaufen wird. Das ist meine Einschränkung.

4) Wir verwenden auch Guava / Trove, aber sie sind nicht in der Lage, so große Datenmengen auch in 16 GB zu speichern (wir verwenden einen 32 GB Ubuntu-Server).

Antworten auf die Frage(3)

Ihre Antwort auf die Frage