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