Homepage selbermachen 7.852 Themen, 35.619 Beiträge

Probleme mit CRC, MD5 und SHA1 in PHP bei Dateien mit 1,1GB

Sandor1 / 2 Antworten / Baumansicht Nickles

Hallo zusammen,

ich würde gerne per PHP die Checksum einer Datei berechnen; genau genommen gehts um CRC, MD5 und SHA1.
Meine Funktion dazu sieht bisher so aus:

$file = "test.file";
$filecontent = file_get_contents($file);
$crc = strtoupper(dechex(crc32($filecontent)));
$md5 = strtoupper(md5($filecontent));
$sha = strtoupper(sha1($filecontent));
echo "file: $file<br />\r\n crc: $crc<br />\r\n md5: $md5<br />\r\n sha1: $sha";


Das Problem: die Funktion macht das (zumindest wirkt es so) einwandfrei bis zu einer Dateigröße von ca. 1.100.000.000 Bytes, also in Windows ~1.02GB; die Datei die ich prüfen will ist aber 1.185.760.800 Bytes groß, und statt der Checksums bekomme ich nur gemeldet "Fatal error: Out of memory (allocated 786432) (tried to allocate 1185768992 bytes) in C:\index.php on line 439"...

Ich hab mit PHP erst vor kurzem angefangen und zugegebenermaßen noch keine Ahnung davon ^^
Allerdings kann ich mir absolut nicht erklären warum da (scheinbar) der Speicher ausgeht... einige Daten zur Config:

Hardware (mehr denke ich ist für die Funktion/das Problem nicht interessant):
Core 2 Quad @ 3.5GHz
4GB DDR2-800

Software:
Vista x64 SP1
XAMPP für Windows Version 1.6.7 (PHP 5.2.6)
memory_limit = 3072MB (nur um das als Fehlerquelle ausschließen zu können, 1536MB funktionierten auch nicht)

Außerdem bilde ich mir ein bei diesen "Out of memory" Messages normalerweise "(allocated x bytes)" angezeigt bekommen zu haben, hier fehlt allerdings das Wörtchen "bytes" ?
Und irgendwie ist mir die Bytesize die "allocated" wurde nicht ganz geheuer... 786432 Bytes, genau 0.75MiB ? Vielleicht kann jemand daraus ja irgendwas deuten ;)

Die Arbeitsspeichernutzung für apache32.exe (gibt's auch 64?) geht bis zu einem gewissen Punkt (ich nehme mal schwer an bis der $filecontent eingelesen ist) laut Win-Taskmanager auf maximal 1.111.844 KBytes, also 1.138.528.256 Bytes hoch wenn eine 1.100.000.000 Bytes Datei eingelesen wird.

Ansonsten (d.h. wenn die Funktion nicht gerade ausgeführt wird) zeigt der Win-Taskmanager eine Speichernutzung von 2,1GB an (wohlgemerkt am Windows-Desktop... mit Firefox 3 und > 140 Tabs, => ~500MB RAM für den Firefox); daher dachte ich ich probiers mal mit dem IE 7, da ging die Speichernutzung dann (kein FF, IE mit 1 Tab..) auf 1,6GB zurück. Die 1.185.760.800 Bytes große Datei kann ich trotzdem nicht einlesen, genau der gleiche Fehler wie im Firefox vorher.


Bin dankbar für jeden Tip!

MfG Sandor

bei Antwort benachrichtigen
Borlander Sandor1 „Probleme mit CRC, MD5 und SHA1 in PHP bei Dateien mit 1,1GB“
Optionen
$filecontent = file_get_contents($file);
Es wundert mich, daß es überhaupt möglich ist einen String mit 1GB Größe in PHP einzulesen.

Um es kurz zu machen: Die Vorgehensweise ist schlicht und einfach Ungeeignet.

Lass Dir die Checksumme durch einen externen Aufruf von md5sum berechnet, für die anderen Summen entsprechend auch. Das wird deutlich weniger Speicher beanspruchen (für diesen Vorgang muß nicht die gesamte Datei im Speicher gehalten werden) und auch schneller sein. Abgesehen davon. Nachteil wäre natürlich die schlechtere Porabilität.

Wäre aber sowieso sinnvoller die Checksummen nur einmalig zu generieren - die sollten sich schließlich nicht ändern, solange die Datei unverändert bleibt.


Gruß
Borlander
bei Antwort benachrichtigen
Sandor1 Borlander „ Es wundert mich, daß es überhaupt möglich ist einen String mit 1GB Größe...“
Optionen

Danke für die Antwort, ich bin nur leider momentan etwas kurz angebunden und komm nicht groß zum basteln.

Ich melde mich dann die Tage, wenn ich die Zeit hatte damit noch etwas rumzuprobieren.

MfG Sandor

bei Antwort benachrichtigen