Großes PHP/ MYSQL - Problem (30MB Daten in MYSQL?)

gondor

Mitglied
hallo liebe community!

leider habe ich ein schwerwiegendes problem:

ich habe eine ca. 30MB große datei, die messdaten in dieser form:

35.000 23.212 20.019 23.945 20.996 22.724 20.019
36.000 23.212 20.019 23.701 20.996 22.724 20.263
37.000 23.457 20.019 23.701 20.996 22.724 20.507
...

(mehr als >70.000 zeilen)

enthält. dabei steht die erste spalte für die zeit der messung (sec) und die restlichen sind die dazugehörigen temperaturmesswerte (°C). soweit alles noch in ordnung.

diese werte möchte ich zur weiterverarbeitung gerne in eine mysql-db speichern.

da ich noch nie in einer solchen dimension programmiert bzw. zu tun hatte, verzweifel ich schon überhaupt an die mächtige größe des files (da diese via fread und ähnlichen einfach nicht einzulesen is)t. des weiteren ist die frage, wie ich am besten einlesen soll damit die werte auch ordentlich in meine db gespeichert werden, und wie müßte überhaupt gespeichert werden?

oder kann das txt-file 'direkt' in eine db importiert werden? (leider kann excel aufgrund der vielen zeilen nicht alles darstellen, wenn ich die txt mit excel öffne)

es bleibt mir zurzeit nichts anderes übrig ein paar user-meinungen (evtl auch von erfahrenen programmieren) zu sammeln, die in mein vorhaben etwas zeit investieren und eine realisierung mit mir ermöglichen können. vllt. ist einfach mein ansatz schlecht, meine architektur oder muss ich mit anderen programmiersprachen vorlieb nehmen? gibt es beispiele oder ähnliche quellen...?

ist wirklich drigent, da ich dieses für eine wissenschaftliche ausarbeitung benötige.

hab keinen rat mehr... plz help ;-)

gondor(..)
 
Zuletzt bearbeitet:
Musst du diesen Prozess regelmäßig so großen Dateien durchführen?

Wenn nicht, würde ich empfehlen, die Datei manuell zu verkleinern...
Anschließend benutzt du fread um die Datei zeilenweise auszulesen, dann kannst du die Daten ganz normal in die Datenbank eintragen

Du kannst die Konfiguration des Webservers auch so anpassen, dass es möglich ist solch eine große Datei auszulesen.
 
@lars

danke für deine schnelle antwort. ;-)

der prozess muss (bis jetzt) schon öfters wiederholt werden.

zur messung:

dabei handelt es sich um messungen die vielleicht 2-3 tage durchlaufen könnten, was natürlich immens hohe daten bedeutet (bei jeder sec ein eintrag...). mir wäre es natürlich auch lieber weniger daten zu haben (hatte es mit ca. 2MB ausprobiert *schwärm*) aber manuelle bearbeitung bedeutet bei >70.000 zeilen ziemlichen mehraufwand.

evtl. gibt es ein scrip, dass automatisch die files splitted, da mehrere messungen in dem file stattfinden:

0.000 | 23.212 | 20.019 | 23.945 | 20.996 | 22.724 | 20.019 <- 1. messung
1.000 | 23.212 | 20.019 | 23.701 | 20.996 | 22.724 | 20.263
2.000 | 23.457 | 20.019 | 23.701 | 20.996 | 22.724 | 20.507
3.000 | 23.457 | 20.019 | 23.701 | 20.996 | 22.724 | 20.507
...
22.507.000 | -16.826 | 86.914 | -10.478 | 84.937 | -19.432 | 83.654
...
0.000 | 23.212 | 20.019 | 23.945 | 20.996 | 22.724 | 20.019 <- 2. messung

...und mit den zeitwert 0.000 wieder anfangen.

was meinst du denn mit der konfiguration des webservers? wäre das eine brauchbare lösung?

ansonsten für jeden tipp dankbar ;)
 
Zuletzt bearbeitet:
Hi, bin zwar kein PHP-Experte, aber wiese geht es nicht mit fread?

Verwendest du fread mit dynamischen Speicher in einer Schleife, dann kannst Du doch beliebig große (oder kleine) Häppchen am Stück einlesen, diese auswerten (Sql-Anweisungen dazu erstellen) und dann den nächsten Happen nehmen.

Wo genau scheitert fread?

Wie es Performance-mäßig aussieht, kann ich Dir nicht sagen. Aber 70000 Zeilen sind doch eigentlich kein Problem, oder?

Ansonsten evtl. noch ein Tipp (für Linux)
split -l 1000 Dateiname
Teilt eine Datei in EinzelDateien zu je 1000 Zeilen auf.
Split müßte es auch irgendwie für Windows geben.

vop
 
@vop

dachte ich´s mir doch. hier wird man nicht allein gelassen ;)

wie meinst du in häppchen? kann man evtl. in blöcke einlesen? das ist natürlich eine überlegung, die ich noch gar nicht angestellt habe. da ich morgen wieder am rechner sitze, teile ich meine erfahrungen natürlich gleich mit.

wie stark 'performance-abhängig' ist denn das ganze?

zu den zeilen. es sind bestimmt >300.000 zeilen.

<edit> so hab mal nachgeschaut: eine datei hat ca. 235.000 zeilen </edit>

also, mehr gibt es morgen zu berichten...

danke für den bisherige 'gehirnschmalz' :)
 
Zuletzt bearbeitet:
Original geschrieben von gondor
oder kann das txt-file 'direkt' in eine db importiert werden?
Hi,

das sollte doch mit phpMyAdmin funktionieren, dort kannst Du als Feldtrenner ein Leerzeichen angeben und direkt die .txt einlesen.

70.000 Zeilen á 7 floats sollten kein Problem sein.
 
Mit der Konfiguration des Webservers meinte ich die zulässige Laufzeit, die ein Script haben darf.
Wenn diese Laufzeit überschritten wird, wird der Prozess automatisch "gekillt".

Ich hätte es jetzt einfach so versucht:
In einer Schleife wird das Script zeilenweise ausgelesen, die Daten aus der aktuellen Zeile werden dann in die Datenbank eingetragen, dann läuft die Schleife jede einzelne Zeile durch und fertig ist der Salat ;-)

Hi,

das sollte doch mit phpMyAdmin funktionieren, dort kannst Du als Feldtrenner ein Leerzeichen angeben und direkt die .txt einlesen.

70.000 Zeilen á 7 floats sollten kein Problem sein.

Geht das echt? Leerzeichen als Trennzeichen angeben? Habe ich noch nie gemacht...aber wäre ja ne Möglichkeit...
 
Es ist jetzt nur die Frage: Wenn das Programm in C++ ist könnte er ja eigentlich gleich über das Programm die Einträge in die Db machen oder automatisch nach einer gewissen Zeit ein neues File anfangen.
 
Original geschrieben von gondor
oder kann das txt-file 'direkt' in eine db importiert werden?

hast du Zugriff auf MySQL von der Shell aus? Wenn ja, dann log dich ein und versuch mal
Code:
mysql> LOAD DATA INFILE 'deineDatei.txt' INTO TABLE deineTbl(c1, c2, c3, c4)
    -> FIELDS TERMINATED BY ' '
    -> LINES TERMINATED BY '\r\n';
mysql> und -> sollen den Mysql Promt darstellen, müssen also nicht mit eingegeben werden. \r\n stimmt nur wenn es sich um ein Textfile handelt, das in Windows erstellt wurde. Die (c1, c2, c3...) geben die Reihenfolge an, in welche Spalten geschrieben werden muss... also anstatt C1 usw einfach den konkreten Spaltennamen schreiben... Hoffe es funktioniert mit 30 MB files... ansonsten wie schon gesagt - das File Splitten in z.B. 10 * 3 MB Files - diese sollten dann leicht zu importieren sein... Natürlich wäre es besser wenn du direkt in die Datenbank schreiben könntest und nicht erst den Umweg über das Textfile gehen musst... Hast du das Messreihenprogramm selbst geschrieben, bzw kommst du an den Sourcecode? MySQL Bindings sollte es für nahezu jede Sprache geben...

bye
 
Zuletzt bearbeitet:
@Skinner:
Ich denke mal, dass er den Schritt zu PHP nicht gemacht hätte, wenn er
a) Das Programm das die Daten ausgibt umschreiben könnte
b) Selbst wenn er die Möglichkeit hätte auch das Wissen hätte es in c++ umzuschreiben

:-)
 
Zurück