Viele Strings auf Existenz prüfen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

    Viele Strings auf Existenz prüfen

    Hallo.

    Ich habe ca. 1.200.000 Strings mit einer Länge von 3-15 Zeichen.

    Diese Strings werden online gesammelt.


    Jetzt geht es darum, zu prüfen, ob
    Strings bereits schoneinmal verwendet wurden.
    Dafür muss ich die Strings irgendwie speichern.

    Um temporäres Zwischenspeichern geht es nicht, es soll
    auch nach PC Start geprüft werden , ob die Strings schon vorhanden sind oder nicht - also muss man sie irgendwo "fest" speichern.

    Eine Textdatei ist dafür meiner Meinung nach ungeeignet,
    da 1.200.000 Strings zuviel wäre um es in die Anwendung einzulesen.

    Hat jemand eine Idee wie man soetwas lösen könnte?

    Ziel: Abfrage ob String x bereits vorhanden ist, dabei geht es vorallem um Geschwindigkeit der Prüfung.
    Mir würde dazu spontan nur einfallen die Strings in Byte-Arrays umzuwandeln und sie dann abzuspeichern.
    dotnet-snippets.de/snippet/str…y-und-zurueck-wandeln/645
    Oder ggf. in Hex.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Kevin Hombre schrieb:

    bereits schoneinmal verwendet wurden.
    So was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim ll As New List(Of String) From {"aa", "bb", "cc"}
    3. Dim aa() = {"bb", "cc", "dd", "ee", "ff"}
    4. For Each a In aa
    5. If Not ll.Contains(a) Then
    6. ll.Add(a)
    7. End If
    8. Next
    9. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Du hast nicht richtig gelesen.


    Kevin Hombre schrieb:

    Um temporäres Zwischenspeichern geht es nicht, es soll
    auch nach PC Start geprüft werden , ob die Strings schon vorhanden sind oder nicht - also muss man sie irgendwo "fest" speichern.




    So dumm bin ich natürlich nicht.

    Das was Du da machst wird in den RAM gepackt und ist beim Neustart vom System demnach futsch.

    Kevin Hombre schrieb:

    Diese Strings werden online gesammelt.
    das sieht mir nach Malware aus. DataMining oder sowas.
    Daten werden aussm INet gesammelt, und iwie geldverwertbar aufbereitet und an Interessenten verkauft.
    Wessen Daten da verkauft werden - der wird nicht gefragt.

    Email-Addressen für Spammer? TelefonNummern für Reklame-Fuzzis?

    Kevin Hombre schrieb:

    So dumm bin ich natürlich nicht.
    Selbstverständlich nicht.
    Füge hinzu:

    VB.NET-Quellcode

    1. System.IO.File.WriteAllLines(PATH, ll.ToArray)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ist keine Malware.

    Sonst würde ich mich hier nicht melden..



    Also wenn ich die Strings in eine List(Of String) einlese
    aus einer Textdatei, dann steigt der Arbeitsspeicherverbrauch der Anwendung von
    35mb auf 64mb. Das funktioniert, is mir aber eigentlich zu viel.
    Dataset bauen, die Strings in einer XML-Datei (Dataset-Funktion) speichern und via LINQ prüfen, ob ein String schon vorhanden ist. Alternative wäre eine MySQL/MSSQL/SqlCe-Datenbank, sodass dein Programm relativ wenig Arbeitsspeicherbedarf hat.
    Wo ist das Problem?

    @RodFromGermany: es gibt bei den Linq-Extensions die Methoden Enumerable.Union() und Enumerable.Zip(). Mit komischen For-Konstrukten muss seit den Linq nicht mehr gearbeitet werden.