CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
25.04.2005, 17:55:05
|
Anfänger
|
|
Registriert seit: Dec 2004
Ort: Dachau
Beiträge: 13
|
|
Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Huston, wir haben ein Problem. Na ganz so schlimm ist es nun auch nicht. Also folgendes. Ich habe eine Datendatei in der sich diverse Daten für ein Shopsystem befinden. Nun ist es jedoch so, dass diese Datei relativ (16 MB)gross ist. Wobei Sie rein theoretisch auch grösser sein kann. Das Problem ist nun, dass, wenn ich die Datei mit fopen() und anschliessend mit fread() öffnen will, dass soweit auch noch funktioniert, anschliessend jedoch immer die Fehlermeldung "Allowed memory size of 33554432 bytes exhausted(Tried to allocate XXX bytes) kommt. Vermutlich liegt dass daran, dass ich die relativ grosse Datenmenge dann auch noch in ein array packen möchte und mysql tauglich in eine Tabelle reinzu inserten. Nun könnte man ja nun auch sagen, man liest die Datei einfach zeilenweise ein und wertet sie dann einfach so aus. Dazu wäre die Datenstruktur ein bischen ungünstig. Siehe folgend:
[KOPF]
Version: 1.5
Tabelle: Modell
Zeichensatz: ANSI
Waehrung1: EUR
Waehrung2: EUR
Preisgruppe: 1
MwSt_Status: J
[MODELL]
Primkey_Artikel:5550
Modell_EAN: 9920062266132
Anzeige: J
M1_Text: pink
M1_Langtext:
M2_Text:
M2_Langtext:
M3_Text:
M3_Langtext:
W1_Typ: EUR
W1_Preis: 12.00
Lagerbestand: 0.000
Sonderpreis: 0.00
VKempf: 0.00
Preis2:
Preis3:
Preis4:
Preis5:
Mindestbestand:
Sollbestand:
Order_offen: 6.00
Staffel2_Preis:
Staffel3_Preis:
Staffel4_Preis:
[MODELL]
Primkey_Artikel:5550
Modell_EAN: 9920062266132
Anzeige: J
M1_Text: pink
M1_Langtext:
M2_Text:
M2_Langtext:
M3_Text:
M3_Langtext:
W1_Typ: EUR
W1_Preis: 12.00
Lagerbestand: 0.000
Sonderpreis: 0.00
VKempf: 0.00
Preis2:
Preis3:
Preis4:
Preis5:
Mindestbestand:
Sollbestand:
Order_offen: 6.00
Staffel2_Preis:
Staffel3_Preis:
Staffel4_Preis:
...usw.
Ich wüsste nicht, wie ich das so ohne weiteres hinbekommen soll. Vorallem ist es so, um den Script timeout von 30 Sekunden zu umgehen wird dass Script alle 10 Einträge neu gestartet. Ich hab jetzt schon versucht, nur eine gewisse Menge an Daten auf einmal einzulesen fread($handle,1024*1024), was soweit auch funktioniert, allerdings muss ich meinem Skript beim Neustart ja irgendwie sagen wo er gerade war um da dann mit dem Datenimport weitermachen zu können. Leider kann ich die Datenstruktur nicht verändern, also eine horizontale Darstellung erreichen, was die Sache wesentlich vereinfachen würde. Vielleicht habt ihr ja eine Idee, wie man oben dargestellte Struktur mit 34.000 Solcher Datensätze ohne speicherprobleme in eine Mysql-Datenbank reinbekommt, ohne dabei auch noch an einen timeout des Servers zu gelangen. ich bin extrem verzweifelt!!.
Danke schon mal für eure hilfe!
|
25.04.2005, 20:32:03
|
|
SELFPHP Guru
|
|
Registriert seit: May 2003
Beiträge: 7.187
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Zitat:
Zitat von mare26
Ich hab jetzt schon versucht, nur eine gewisse Menge an Daten auf einmal einzulesen fread($handle,1024*1024), was soweit auch funktioniert, allerdings muss ich meinem Skript beim Neustart ja irgendwie sagen wo er gerade war um da dann mit dem Datenimport weitermachen zu können.
|
Gib doch einfach die Position der letzten Dateioperation per GET an das Script weiter, dann kannst du genau an der Stelle weitermachen.
|
26.04.2005, 10:02:06
|
|
Administrator
|
|
Registriert seit: Apr 2002
Ort: Bergheim
Alter: 41
Beiträge: 5.255
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Eine andere Moeglichkeit waere es, die Datei lokal in die DB zuspielen, dann mit MySQLDumper einen Dump zuerstellen und diesen auf den Onlineserver einzuspielen.
__________________
Gruß |Coding
---
Qozido® - Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.
www.qozido.de
|
26.04.2005, 10:44:46
|
|
Junior Member
|
|
Registriert seit: Apr 2005
Beiträge: 401
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Bei so eoinem grossen Shopsystem würde ich auf jeden Fall versuchen den zugewiesenen Speicher zu erhörhen......
Schon alleine aus performancegründen
Oder das Problem andersrum angehen.....Irgendwo müssen ja die Daten herkommen
evtl. Datenformat ändern.......
Oder ganz anders rum....lokal auf einen Testserver aufspielen und die myds in die DB kopieren (sofern screibrechte auf dem SQL Server bestehen.....)
oder wieder anders rum wie oben beschreiben sich die Lage des Dateizeigers merken und dann an der Stelle weiter auslesen....
Geändert von dachris (26.04.2005 um 10:47:35 Uhr)
|
26.04.2005, 13:03:42
|
Junior Member
|
|
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Hi dachris,
Zitat:
Oder ganz anders rum....lokal auf einen Testserver aufspielen und die myds in die DB kopieren (sofern screibrechte auf dem SQL Server bestehen.....)
|
Die MySQL Dateien eins zu eins von einem (lokalen) System auf ein anderes (produktives) System zu spielen ist nicht ganz ungefährlich.
Einige sehr gute Leute, die sich mit MySQL auskennen, antworten auf Fragen a la "kann ich eine Datenbank sichern bzw. replizieren, indem ich die Dateien kopiere?" ganz klar mit "besser nicht!".
Grund hierfür ist, daß es dabei passieren kann, daß MySQL wichtige Dinge nicht sauber mitbekommt und es dadurch im schlimmsten Fall zu einer Datenkorruption kommen kann. Ein Datenverlust ist in diesem Fall weniger übel, da die Originaldateien ja noch da sein sollten und ein Verlust schneller bemerkt wird bzw. werden kann.
Also: Nur über die (My) SQL Wege Daten in die Datenbank einspielen, vor allem bei wichtigen Daten.
HTH,
Andy
Hier noch der relevante Abschnitt aus einem aktuellen Thread auf mailing.database.mysql vom 11.April 2005
Zitat:
> Can i update a MySQL database with just copy the files MYI MYD and FRM
> in the right dir? I know this work.
This is not safe to do in general. MySQL might have data in memory that
it expects to write to the files. Changing the files outside of control
of mysqld creates a risk of losing unsaved data. If this has worked for
you in the past, I would describe this as, "you haven't lost any data
_yet_."
|
|
26.04.2005, 14:00:40
|
|
Junior Member
|
|
Registriert seit: Apr 2005
Beiträge: 401
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Das man das nicht imlaufenden Betrieb machen sollte ist klar :-)
Ich baue ja den Motor von meinem Auto auch nicht auf der Autobahn bergab mit 150 aus :-)
|
27.04.2005, 09:17:59
|
Junior Member
|
|
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Hi dachris,
hast natürlich Recht. Dennoch gibt es immer wieder ein paar, die meinen, es ausprobieren zu wollen.
Außerdem glaub ich nicht, daß man ohne eigenen Webserver bzw. Datenbankserver so einfach den produktiven Datenbankserver runterfahren kann, um Dateien zu kopieren. Da laufen ja schließlich noch andere Datenbanken drauf, die halt vor einem nur "versteckt" sind.
Wie auch immer, mein Posting war nur als Warnung für diejenigen gedacht, die hier nicht sehr gut aufpassen und sich nicht die Schritte sehr genau überlegen und timen, die zu tun sind.
Gruß,
Andy
|
27.04.2005, 09:30:47
|
|
SELFPHP Guru
|
|
Registriert seit: May 2003
Beiträge: 7.187
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Zitat:
Zitat von diver-network
Außerdem glaub ich nicht, daß man ohne eigenen Webserver bzw. Datenbankserver so einfach den produktiven Datenbankserver runterfahren kann, um Dateien zu kopieren. Da laufen ja schließlich noch andere Datenbanken drauf, die halt vor einem nur "versteckt" sind.
|
Wenn man den Datenbankserver nicht selbst stoppen und starten darf, wird man vermutlich aber auch keine Schreibrechte im MySQL-Verzeichnis haben?!
|
27.04.2005, 14:19:24
|
|
Junior Member
|
|
Registriert seit: Apr 2005
Beiträge: 401
|
|
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"
Das ist richtig....
Aber ein Shop in der Grösse sollte durchaus einen eigenen rootserver haben.....wenn er auch die entsprecchenden Userzahlen hat.....
Aber da man für Shopsysteme auch noch andere Module benötigt....Payment, Backendanbindung etc.....wer will sich schon die Bankdaten eines Kunden per mail schicken lassen.....ist ein Root indiziert...
Nur dann kann man natürlich auch die ini umstellen und die ganze Diskussion ist hinfällig.....
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 23:10:51 Uhr.
|