SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 25.04.2005, 18:55:05
mare26 mare26 ist offline
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!
Mit Zitat antworten
  #2  
Alt 25.04.2005, 21:32:03
Benutzerbild von xabbuh
xabbuh xabbuh ist offline
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.
Mit Zitat antworten
  #3  
Alt 26.04.2005, 10:26:00
Matthias Matthias ist offline
Moderator
 
Registriert seit: Jan 2002
Ort: CologneCity
Alter: 46
Beiträge: 484
AW: Datei einlesen erzeugt "Allowed memory size of 33554432 bytes exhausted"

Du solltest dir folgende Funktionen ansehen:
http://www.selfphp.de/funktionsrefer...e_ini_file.php
http://de2.php.net/manual/en/functio...time-limit.php

Und falls du auf die php.ini Zugriff hast, kannst du das memory_limit erhöhen.

Mit diesen Zutaten sollte es jetzt kein Problem mehr sein dies in eine DB zu schreiben ;)
Mit Zitat antworten
  #4  
Alt 26.04.2005, 11:02:06
Benutzerbild von |Coding
|Coding |Coding ist offline
Administrator
 
Registriert seit: Apr 2002
Ort: Bergheim
Alter: 41
Beiträge: 5.255
|Coding eine Nachricht über Skype™ schicken
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
Mit Zitat antworten
  #5  
Alt 26.04.2005, 11:44:46
Benutzerbild von dachris
dachris dachris ist offline
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 11:47:35 Uhr)
Mit Zitat antworten
  #6  
Alt 26.04.2005, 14:03:42
diver-network diver-network ist offline
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_."
Mit Zitat antworten
  #7  
Alt 26.04.2005, 15:00:40
Benutzerbild von dachris
dachris dachris ist offline
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 :-)
Mit Zitat antworten
  #8  
Alt 27.04.2005, 10:17:59
diver-network diver-network ist offline
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
Mit Zitat antworten
  #9  
Alt 27.04.2005, 10:30:47
Benutzerbild von xabbuh
xabbuh xabbuh ist offline
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?!
Mit Zitat antworten
  #10  
Alt 27.04.2005, 15:19:24
Benutzerbild von dachris
dachris dachris ist offline
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.....
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Inhalt einer Datei ab einem Fixpunkt einlesen rkersting PHP für Fortgeschrittene und Experten 11 21.03.2005 13:52:47


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:18:24 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt