Anzeige:
Ergebnis 1 bis 3 von 3

Thema: 40 GB Daten bearbeiten

  1. #1
    Registrierter Benutzer Avatar von Iteranium
    Registriert seit
    03.08.2009
    Beiträge
    40

    40 GB Daten bearbeiten

    Hallo,

    ich habe 20 GB Daten aus einem 3D Scanner (10.000.000.000 Pixel bei 16 Bit), die es zu analysieren gilt.

    Die Algorithmen benötigen mindestens 137^3 Datenpunkte, das sind dann nur ungefähr 4 MB. Für die nächste Rechenoperation brauche ich dann die gleiche Box um einen Pixel verschoben. Da jedoch 8 Threads parallel arbeiten sollen, müssten mindestens ein wenig mehr Daten da sein, sagen wir 6 MB.

    In der Originaldatei sind die Daten einfach hintereinander weg geschrieben, ich könnte jeden Zahlenwert im Prinzip mit x+2150*y + 2150*2000*z erreichen, aber das erscheint mir sehr unperformant. Oder würde C++ automatisch die Datei so puffern, dass ich bei ganz vielen seek() Kommandos nicht schlechter dastehe als bei einem Array?

    Alternativ habe ich mir überlegt die große Anfangsdatei in Scheiben zu je 2150^2 Pixel zu zerteilen, eine der ca. 2000 Scheiben wäre dann nur noch 8 MB groß. Wenn ich 137 davon übereinander in den Speicher laden würde wären das nur noch 1207 MiB. Wenn ich mit der obersten Scheibe fertig bin, ersetze ich diese durch eine neue unten, so bin ich bei 1207 MiB Speicherauslastung und kann beliebig viele Schichten durchgehen.

    Den Zerteilansatz zu ende gedacht wäre natürlich, wenn man die Datei in Würfel einteilt. Jedoch hätte ich dann noch mehr Datenverwaltungscode, wobei weniger Speicher benötigt wird und das ganze beliebig skalierbar wird. Um diese Würfel jedoch zu erstellen, müsste ich irgendwie wieder die Ausgangsdatei auslesen, und diese erstmal in Scheiben zerteilen und dann wieder Würfel bauen. Und wenn ich n Scheiben in den RAM bekomme um einen Würfel mit Kantenlänge n zu erstellen, kann ich auch einfach direkt n Scheiben laden und verarbeiten.

    Wie würde man das sinnvoll in C++ umsetzen, kann man einfach die Datei mit Random Access benutzen, oder sollte man es lieber irgendwie Stückweise in den Speicher laden? Jeder Pixel wird während eines Durchlaufes schätzungsweise 151.000 mal ausgelesen.

    Der Rechner, auf dem das ganze Laufen soll, läuft unter Linux (OpenSuSE 11) und hat 2* Xeon 4-Kern, 8 GiB RAM sowie 16 GiB swap.

    Ich würde mich über Tipps riesig freuen!


    Grüße,

    Iteranium

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du könntest es mal mit mmap() versuchen.

    Damit kannst du einen von dir bestimmten Bereich einer Datei in den Speicher einblenden, so dass man darauf wie auf ein Array zugreifen kann.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von Iteranium
    Registriert seit
    03.08.2009
    Beiträge
    40
    Danke, damit habe ich heute mal 4 GB Teildaten durchsucht, klappt wirklich gut.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •