[gelöst]große preComputed hash tabelle einbinden in das programm



  • simon.gysi schrieb:

    phazz schrieb:

    Tachyon schrieb:

    Du konntest die Tabelle auf den Heap laden, also dynamisch Speicher anfordern. Du könntest auch blockweise Häppchen aus der Datei lesen, und dann die Blöcke bearbeiten.

    d.h: so wie ich es eigentlich gemacht habe, in der header das array einbinden?<- landet dann ja im heap!?

    Beim Kompilieren wird trotzdem die ganze 600MB grosse datei eingelesen (-> da hast Du offenbar zu wenig RAM dafür).

    Danach landet das Array zu Laufzeit nicht auf dem Heap.

    Es müssen zwei Dinge unterschieden werden: Kompilierzeit und Laufzeit.
    Gäbe es nicht andere Ansätze? Datenbank? Oder vielleicht das File zu Laufzeit in Blöcken laden und entladen?

    ne das mit blöcken laden entladen, ist nicht möglich weil variabel auf die werte im array zugriffen wird => nicht vorhersehbar wann worauf zugegriffen wird.
    datenbank ist wieder ein flaschenhals(zu langsam xD),
    wie gesagt sollte wirklich im speicher liegen, nur wie bekomm ich die tabelle da rein, haha xD,
    je nach compiler wird sogar:"Kein verfügbarer Speicher mehr im Heap" (beim compilen)ausgegeben. (wie du sagtest)

    folgendes: beim erstellen der tabelle zur laufzeit funktioniert alles wunderbar!
    prog(das die tabelle erstellt)verbraucht dann auch nur ~280mb, da 1Mb = 1024kb.

    die tabelle sollte halt beim starten des programms in den speicher geladen werden, vielleicht über statische libs einbinden o_O?



  • Memory Mapped I/O fiele mir da ein.



  • Kannst Du nicht beim Aufstarten die Datei einlesen und im Array abspeichern?
    So würde ich das machen. Sonst hast Du ja auch ein riesiges Exe...



  • simon.gysi schrieb:

    Kannst Du nicht beim Aufstarten die Datei einlesen und im Array abspeichern?
    So würde ich das machen. Sonst hast Du ja auch ein riesiges Exe...

    hmm wäre auch eine idee, ist aber da nicht das problem, dass das starten des programms dann ewigkeiten dauern würde??



  • Wenn Du das effizient einliest nicht.



  • simon.gysi schrieb:

    Wenn Du das effizient einliest nicht.

    da die shorts im array ja als 0-65536 abgespeichert sind, wäre es nicht effizienter das im binär system zu speichern? was meinst du?



  • phazz schrieb:

    simon.gysi schrieb:

    Kannst Du nicht beim Aufstarten die Datei einlesen und im Array abspeichern?
    So würde ich das machen. Sonst hast Du ja auch ein riesiges Exe...

    hmm wäre auch eine idee, ist aber da nicht das problem, dass das starten des programms dann ewigkeiten dauern würde??

    und eine ~300mb grosse exe datei zu laden passiert sofort?
    natuerlich dauert das einlesen der werte seine zeit, aber das ist bei 280mb an daten nur logisch.

    wenn du kurze lade zeiten willst, darfst du eben keine 280mb an daten in den ram schreiben sondern nur segmente daraus und dynamisch nachladen was noetig ist.



  • Shade Of Mine schrieb:

    wenn du kurze lade zeiten willst, darfst du eben keine 280mb an daten in den ram schreiben sondern nur segmente daraus und dynamisch nachladen was noetig ist.

    Topic ist "precomputed hash tabelle". Hört sich so an, als ob er alles auf einmal braucht.



  • Shade Of Mine schrieb:

    phazz schrieb:

    simon.gysi schrieb:

    Kannst Du nicht beim Aufstarten die Datei einlesen und im Array abspeichern?
    So würde ich das machen. Sonst hast Du ja auch ein riesiges Exe...

    hmm wäre auch eine idee, ist aber da nicht das problem, dass das starten des programms dann ewigkeiten dauern würde??

    und eine ~300mb grosse exe datei zu laden passiert sofort?
    natuerlich dauert das einlesen der werte seine zeit, aber das ist bei 280mb an daten nur logisch.

    wenn du kurze lade zeiten willst, darfst du eben keine 280mb an daten in den ram schreiben sondern nur segmente daraus und dynamisch nachladen was noetig ist.

    das mit der exe laden, geht schneller als alles aus der datei auszulesen....(zumindest die datei im jetzigen zustand)

    scheinbar bleibt mir keine andere wahl als die tabelle während der laufzeit in den speicher zu laden..... (muss aber als gesamtes geladen werden)
    wie wäre es die tabelle komplett binär auszugeben, und genau so wieder ein zu lesen, dann wären 2*8bits ein index, würde an sich am schnellsten gehen(im vergleich zur string to int umformung etc.)

    //andere idee: wie wäre es die tabelle in einer statischen lib abzulegen(ist dann nunmal etwas groß), und diese dann einbinden???
    => bräuchte dann nur noch einen der das schafft zu kompilieren xD xD xD



  • phazz schrieb:

    das mit der exe laden, geht schneller als alles aus der datei auszulesen....(zumindest die datei im jetzigen zustand)

    bist du dir da sicher? hast du es gemessen? wie viel länger dauert es denn (oder soll es dauern), die 280 mb große datei zu laden, statt der 280 (+x) mb großen exe?



  • suma dartson schrieb:

    phazz schrieb:

    das mit der exe laden, geht schneller als alles aus der datei auszulesen....(zumindest die datei im jetzigen zustand)

    bist du dir da sicher? hast du es gemessen? wie viel länger dauert es denn (oder soll es dauern), die 280 mb große datei zu laden, statt der 280 (+x) mb großen exe?

    hehe wie gesagt: es steht: zumindest im jetzigen zustand der datei die ich einlesen will! wobei man selbst da beachten muss, dass die datei keine 280 mb groß ist , sondern mehr ca 680mb, weil die datei wie in meinem ersten post beschrieben folgendes format hat:

    unsigned short großeTabelle[140.000.000] = {
    1524,2641,.... werte ....42,1,7500
    };

    es war nämlich geplant die tabelle in die exe einzubinden oder von mir aus per lib.

    um die tabelle während der laufzeit einzubauen,müsste man jetzt z,b erst mal die ganzen werte von char to int umwandeln mit der begrenzung "," und das kann ich dir garantieren dauert ewigkeiten!
    deshalb habe ich die idee geäußert, aufgebaut auf euren ideen, die datei im binärsystem zu erzeugen! die datei wäre somit viel kleiner == 280mb ca.
    das letzte problem was mir nun bevorsteht ist, wie lese ich das ganze effizient aus?
    per ifstream? oder hat jmd was besseres, schnelleres=?
    mfg



  • ah ok, da hab ich nicht aufgepasst. die konvertierung in ein binäres format habe ich mal als selbstverständlich vorausgesetzt.

    Bashar schrieb:

    Memory Mapped I/O fiele mir da ein.

    ich unterstütze den vorschlag.



  • suma dartson schrieb:

    ah ok, da hab ich nicht aufgepasst. die konvertierung in ein binäres format habe ich mal als selbstverständlich vorausgesetzt.

    Bashar schrieb:

    Memory Mapped I/O fiele mir da ein.

    ich unterstütze den vorschlag.

    okay werde nun mal bis morgen testen was sich als besserer vorschlag darstellt,
    und euch bericht erstatten 😛
    habe leider keine erfahrung mit "Memory Mapped I/O" (werde mir es mal aneignen ;))

    ich danke euch für die "kreativen" vorschläge und natürlich für eure zeit!



  • memory mapped IO und "table in der exe" haben beide den selben nachteil: es wird die tabelle "häppchenweise" geladen, und dadurch entstehen unnötige seek-zeiten.

    wenn du die tabelle dagegen in ein datenfile schreibst, und dieses bei programmstart komplett in den speicher lädst, sparst du dir diese seek-zeiten.

    was das "speicherabbild" angeht: schreib die tabelle einfach so in das file wie sie im speicher steht, und lade sie genauso wieder rein. dann dauert das mit aktuellen festplatten keine 5 sekunden. mit einem schnellen RAID 0 wahrscheinlich unter 2 sekunden.


Anmelden zum Antworten