node_load/save Speicherproblem
Eingetragen von benny1979 (119)
am 21.06.2010 - 15:36 Uhr in
am 21.06.2010 - 15:36 Uhr in
Hallo,
ich importiere aus einer CSV ungefähr 5.000 Datensätze (einfache, kurze Strings) in einen Inhaltstyp. Ein CSV-Feld enthält eine eindeutige Nummer, die als Primärschlüssel verwendet wird. Leider bekomme ich irgendwann die Fehlermeldung, daß kein weiterer Speicher zur Verfügung steht (Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes) in C:\Projekte\xampp-php5\htdocs\xyz\sites\all\modules\contrib\cck\theme\content-field.tpl.php on line 49).
Ich frage mich jetzt, warum der Speicher vollläuft. Wie kann ich den Code optimieren?
function getPrimaryKeyNID($id) {
$result = db_query("SELECT nid FROM {content_type_mein_inhaltstyp} WHERE field_primary_key_value='%s'", $id);
$nid = db_result($result);
mysql_free_result($result);
return $nid;
}
while(($data = fgetcsv ($csvDatei, 1000, ",", "'")) !== FALSE ) {
$primaryKey = $data[0];
$nid = getPrimaryKeyNID($primaryKey);
if($nid != FALSE) {
// Datensatz existiert bereits => Aktualisieren
$node = node_load($nid, NULL, TRUE);
}
else {
$node = new stdClass;
$node->type = 'mein_inhaltstyp';
$node->created = time();
$node->changed = $node->created;
$node->status = 1;
$node->promote = 1;
$node->sticky = 0;
$node->uid = 1; // UID of content owner
$node->language = 'de';
$node->field_primary_key[0]['value'] = $data[0];
}
$node->title = utf8_encode($data[2]);
node_save($node);
unset($node);
}
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich würde die CSV in eine
am 21.06.2010 - 15:44 Uhr
Ich würde die CSV in eine neue Tabelle Deiner DB importieren und von dort aus importieren, anstatt die CSV zu laden, also anstatt:
<?php
while(($data = fgetcsv ($csvDatei, 1000, ",", "'")) !== FALSE ) {
// code
}
?>
<?php
$result = db_query("SELECT * FROM {import}");
while($data = db_fetch_array($result)) {
// code
}
?>
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Hab ich versucht, bringt aber
am 21.06.2010 - 16:28 Uhr
Hab ich versucht, bringt aber keinerlei Veränderung. Selbst wenn ich in der php.ini das Limit auf 256 MB hochsetze, kommt irgendwann die Fehlermeldung.
Die Funktion, in der die Fehlermeldung erscheint, ist für das Theming der Node zuständig. Das benötige ich aber in dem Fall garnicht. Kann man das deaktivieren?
Tritt der Fehler auch auf,
am 22.06.2010 - 12:08 Uhr
Tritt der Fehler auch auf, wenn du auf
node_load
verzichtest?Nach wie vielen Datensätzen tritt der Fehler auf? Wenn es z.B. immer nach 100 passiert, dann lass das Script einfach 50 mal mit 100 laufen anstatt auf einen Rutsch 5000 zu importieren.
Poste mal dein komplettes Script.
"A Programmer is a device for turning coffee into code!"
Es tritt auch auf, wenn ich
am 22.06.2010 - 13:23 Uhr
Es tritt auch auf, wenn ich auf node_load verzichte. Nach 3200 Datensätzen.
Hier wird das Problem auch diskutiert:
http://groups.drupal.org/node/17211
Dann setzt doch ein Limit pro
am 22.06.2010 - 14:15 Uhr
Dann setzt doch ein Limit pro Durchgang von 200 oder so, dann läuft das Script zwar 20mal aber danach hast Du alle Daten komplett importiert.
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Genau, wie ich auch schon
am 22.06.2010 - 14:46 Uhr
Genau, wie ich auch schon geschrieben hatte, ist die Lösung mit dem Limit sicher die einfachste, wenn du das nur einmalig machen musst.
"A Programmer is a device for turning coffee into code!"
Nur wie giesst man das in
am 22.06.2010 - 23:06 Uhr
Nur wie giesst man das in Modul-Form, ohne dass der Benutzer davon was mitbekommt?