Viele Strings - Return List(Of String) oder globale List(Of String)?

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Wenn man plötzlich so viel RAM benötigt, deutet das meistens auf einen Designfehler im Programm hin. Bist du dir sicher, dass du wirklich so viel RAM brauchst? Das kann man nämlich keinem User zumuten, es sei denn sie wissen, warum das so sein muss.
    Von meinem iPhone gesendet
    Bei sowas würde ich auf eine Datenbank ausweichen. Ansonsten, 'ne einfache Lösung wäre ein Cache-File, das sortierte HashCodes + Dateizeiger, also Adressen innerhalb der Datei, enthält. Dabei ist am Anfang der Datei ein Feld mit zum Beispiel 65536 Long-Feldern, das die Adresse für die bereits gesetzten Hashcodes Adressen zuordnet. Die 65536 kommt bei mir von der Wahl der Hashcode-Breite, die in meinem Vorschlag 16 Bit ist (berechnet sich halt entsprechend zu CShort(((hashcode >> 16) Or hashCode And) &HFF) ). Also am Anfang hast du 65536 * 8 Bytes, die einen der Hashcodes auf die Adresse mappen, an der der tatsächliche String zwischengespeichert wird. Vor dem String befindet sich dann noch ein 8-Byte Zeiger auf den nächsten String mit dem gleichen Hashcode. Ggf. kannst du noch einen weiteren Hashcode vor den String schieben - ggf. auch anders brechnet, als den 1. und auf jeden Fall mit größerer Breite - und die Stringlänge. Der String wird dann von dem Programm auf Äquivalenz verglichen, wenn er nicht vorhanden ist, wird der Zeiger vor dem String auf das Dateiende gesetzt (einfach die 8 Bytes überschreiben) und am Dateiende wird der neue Block generiert. Der Zeiger auf den nächsten Block ist 0L, wenn er nicht gesetzt ist. Das Verfahren ist bei der Menge auf jeden Fall um einiges schneller, als die herkömmlichen Listen, aber auch etwas speicherlastig. Wenn du mehrere Cacheebenen einbaust und den Zugriff auf den Cache dann über abstrakte Klassen modellierst, kannst du eine konkrete Klasse für die Datei und eine für ins Memory gecachte Daten einbauen. Die im Memory gecachten Daten sind wesentlich schneller ansteuerbar, als die auf der Festplatte, also würde es sich lohnen, Daten, die innerhalb eines Blocks häufig auftreten, im Memory zu behalten. Zusätzliche Performance erhältst du aus dem oben genannten 2. Hashcode (der, der direkt vorm String steht). Wenn der Hashcode zum Beispiel aus 4 Longs besteht, hast du insg. 4 Vergleiche, bei Strings wäre sogar eine For-Schleife nötig. C# wär btw. an dieser Stelle sogar besser, da du da das eigentlich erhaltene Byte-Array als Long-Zeiger behandeln könntest und somit die unnötige Konvertierung wegfällt.

    Gruß
    ~blaze~

    Kevin Hombre schrieb:

    Ich hab leider vergessen zu sagen, dass ich aus einem bestimmten Grund nur alle 7 Sekunden einen String verarbeiten kann im Programm.

    Aufgrund von diesem Thread hier habe ich jetzt ein sehr ungutes Gefühl bei dieser Frage.
    Also einen Datenbestand durchtesten wollen, und dabei Pausen einhalten sieht mir sehr nach einem Versuch aus, irgendetwas zu knacken.
    ErfinderDesRades - Moderator - Notiz: Jeder, der die Frage liest, wird denken, du weißt die Antwort selbst.
    Deshalb wirds vmtl. nur Antworten geben, auf die man beleidigt reagieren kann, und da mach ich den Thread besser gleich zu, ehe ein Flamewar losgeht.
    --> closed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()