Allowed memory size of 33554432 bytes exhausted

Hallo,

ich habe mir ein Skript geschrieben, das im IPS Baum nach Referenzen zu einer oder mehreren vorgegebenen ObjektIDs sucht - also nach dem Motto „in welchen Links, Events oder Scripten werden meine Objekte verwendet…“.
Dazu nutzt es die Methoden IPS_GetEvent, IPS_GetLink und IPS_GetScriptContent.


//Beispiele für zu suchende Homematic Instanzen mit Child Objekten
$ids[] = 12004 /*[Hardware\Homematic\Heike\Verschluss\Heike.Verschluss.Fenster:0]*/ ;
$ids[] = 27864 /*[Hardware\Homematic\Heike\Verschluss\Heike.Verschluss.Fenster:1]*/;

$evtList = IPS_GetEventListByType(0);
$linkList = IPS_GetLinkList();
$scriptList = IPS_GetScriptList();

foreach ($ids as $id){
   ListReferences($id);
}

function ListReferences($id){
   Global $evtList;
   Global $linkList;
   Global $scriptList;

   echo '-----' . $id . ' ('.IPS_GetName($id).') ------'..PHP_EOL;

   foreach ($evtList as $evtID){
//    echo 'MemUsage (GetEvent): '.memory_get_usage().PHP_EOL;
      $evt = IPS_GetEvent($evtID);
      if ($evt['TriggerVariableID'] == $id){
         echo "Event: $evtID ".IPS_GetLocation($evtID) .PHP_EOL;
      }
      unset($evt);
   }

   foreach ($linkList as $linkID){
//    echo 'MemUsage (GetLink): '.memory_get_usage().PHP_EOL;
      $link = IPS_GetLink($linkID);
      if ($link['TargetID'] == $id){
         echo "Link: $linkID ".IPS_GetLocation($linkID) .PHP_EOL;
      }
      unset ($link);
   }

   foreach ($scriptList as $scriptID){
//    echo 'MemUsage (GetScriptContent): '.memory_get_usage().PHP_EOL;
      $script = IPS_GetScriptContent($scriptID);
      if ((strpos($script, strval($id)) > 0) && ($scriptID != $_IPS['SELF'])){
         echo "Script: $scriptID ".IPS_GetLocation($scriptID).PHP_EOL;
      }
      unset($script);
   }

   $childrenIds = IPS_GetChildrenIDs($id);

   foreach ($childrenIds as $childId){
      ListReferences($childId);
   }
   return;
}

Leider ist aber bei mir nach bereits nach ca. 5 verarbeiteten Objekten Schluss:eek:

-----27864 (Heike.Verschluss.Fenster:1) ------
Script: 29839 Visualization\WebFront\Gewerke\Sensoren\Gebaeudehuelle ueberwachen
-----58476 (Viz_STATE) ------
-----10831 (STATE) ------
-----25343 (LOWBAT) ------
Event: 16987 CCU\Scripts\Hardwareprobleme\Homematic Geräte prüfen\Event 25343
-----20683 (INSTALL_TEST) ------

Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 33847 bytes) in [CCU\Scripts\_In Arbeit\Referenzen suchen] on line 40

Kommentiert man die Zeilen mit ‚MemUsage‘ aus, dann sieht man, dass bei jedem Aufruf der drei Methoden mehr Speicher gebraucht wird (zwischen 4 und 10k).

Das sollte meiner Meinung nach nicht sein und einmal überprüft werden.

Viele Grüße

Burkhard

Ich glaube nicht, dass ich dort PHP beeinflussen kann, wie viel Speicher es verbraucht. Hast du mal geschaut, wodurch der Speicher verbraucht wird? Hast du evtl. große PHP Dateien, die per IPS_GetScriptContent geladen werden? Pro PHP Thread hast du maximal 32MB zur Verfügung.

paresy

Auch wenn ich die Suche über die Skripte auskommentiere wird das Speichermaximum überschritten (dann jedoch erst bei drei untersuchten Instanzen).

Jeder GetEvent Aufruf verbraucht zusätzliche 4k, jeder GetLink Aufruf zusätzliche 0,25k. Es sieht mir eher nach einem C Problem aus :slight_smile:

Gruß

Burkhard

Habe exakt das selbe Problem. Es tritt auch in einer Funktion auf, die sich am Objektbaum abarbeitet, um ihn nach Objekten mit bestimmten Namen zu durchsuchen. Frisch aktualisiertes IP-Symcon 4 auf Windows 7.