Memory Exhaust bei file()

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Memory Exhaust bei file()

Beitrag von mgutt »

Hi,

ich möchte gerne einen Datensatz einlesen, der sich in einer csv-Datei befindet.

Leider ist die Datei so groß, dass der Arbeitsspeicher nicht mehr reicht um diese komplett mit file() einzulesen.

Wie sollte ich nun vorgehen? Ich hole mir die Daten mit copy() von dem Anbieter ab. Kann ich beim copy() die Datei in mehrere Dateien splitten oder was könnte ich sonst noch machen?

Gruß
Marc
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Jemand mit >2700 Beiträgen sollte es doch eigentlich schaffen, die Funktionen des Dateisystems durchzulesen und dann [php:fopen] und [php:fread] finden :o
KB:knigge
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ne ich dachte direkt an was in Linux.

Habs mit split() gelöst:

Code: Alles auswählen

function splitfile($source)
{
    exec("split --lines=5000 $source cache/daten_");
    return true;
}
Ist zwar komisch, dass split nur in dem Verzeichnis funktioniert, wo es aufgerufen wird, aber zumindest kann ich den Speicherort definieren.

Danach lese ich das Verzeichnis mit glob() ein und arbeite die Dateien einzeln mit foreach() ab.

Trotzdem Danke!
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Und was ist jetzt der Vorteil deiner Variante? Daß das Programm split und ein beschreibbares Verzeichnis vorhanden sein müssen, warscheinlich nicht :roll:
KB:knigge
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Hi,

ich gehe davon aus, dass es schneller ist.

Auch muss man sich keine Gedanken darüber machen welche Zeile ich auslese, wann man stoppt, dass dann in eine Datei packt etc. Also einfach weniger Aufwand. Derzeit mein Ergebnis:

Code: Alles auswählen

function download($src_file, $dst_file, $gz=false)
{
	copy($src_file, $dst_file . ($gz ? '.gz' : ''));
	if ( $gz )
	{
		exec("gunzip $dst_file.gz");
	}
	chmod($dst_file, 0777);
	return true;
}

function splitfile($source, $split)
{
	exec("split --lines=500 $source $split");
	return true;
}

// Datei lokal sichern
download($csv, $source, $gz);
// Datei splitten
splitfile($source, $split);
Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Antworten

Zurück zu „Coding & Technik“