2016-06-28 5 views
0

Ich verstehe nicht, warum ich die folgende Störung erhalte:Speicherleck Problem in CI mysql_result

Fatal error: Out of memory (allocated 10747904) (tried to allocate 93 bytes) in /home/project/public_html/system/database/drivers/mysql/mysql_result.php on line 167 

phpinfo() Details

   localvalue mastervalue 
memory_limit 4028M  4028M 

SQL

SELECT 
    p.*,l.*,u.*,ct.*,t.*,pc.* 
FROM 
    tbl_Product AS p 
    JOIN tbl_DistributorLocationId AS l ON p.fk_LocationId = l.pk_DistributorLocationId 
    JOIN tbl_Manufacturer AS m ON p.fk_Manufacturer = m.pk_ManufacturerId 
    LEFT JOIN tbl_Color AS c ON p.fk_Colors = c.pk_ColorId 
    LEFT JOIN tbl_Texture AS t ON p.fk_Texture = t.pk_TextureId 
    LEFT JOIN tbl_ProductLine AS pl ON p.fk_ProductLine = pl.pk_ProductLineId 
    LEFT JOIN tbl_States AS s ON l.fk_StateId = s.pk_StateId 
    LEFT JOIN tbl_Users AS u ON l.fk_UserId = u.pk_UserId 
    LEFT JOIN tbl_UserType AS ut ON u.fk_UserTypeId = ut.pk_UserTypeId 
    LEFT JOIN tbl_ProductCategories AS pc ON p.fk_CategoryId = pc.pk_CategoryId 
    LEFT JOIN tbl_CategoryType AS ct ON pc.fk_CategoryTypeId = ct.pk_CategoryTypeId 
where 
    1 = 1 
    AND p.boolean_status = 1 
ORDER BY 
    LOCATE('', varchar_Title), 
    LOCATE('', varchar_ProductLineText), 
    LOCATE('', varchar_ColorName), 
    LOCATE('', varchar_TextureName), 
    LOCATE('', text_Description), 
    LOCATE('', varchar_CategoryName), 
    LOCATE('', varchar_CategoryTypeName) 

Ergebnis aus phpMyAdmin

39706 total, Query took 1.2748 seconds. 
+0

Ich bezweifle es ist ein Speicherleck, in der Regel, wenn Sie über genügend Arbeitsspeicher ausgeführt beim Versuch, eine kleine Menge zu verteilen gibt eine unendliche Schleife irgendwo in Ihr Code .. Nur weil der db-Teil nicht genügend Speicher hatte, heißt das nicht, dass das eigentliche Problem darin liegt. Sie könnten zum Beispiel den gleichen Datensatz eine Milliarde Mal herausziehen. – ArtisticPhoenix

+0

Sie können nicht die sehr großen Daten auf der Abfrage abrufen ... Verwenden Sie tun While-Schleife, um den Speicher abzurufen und zu löschen – Sundar

+0

Wir müssten wirklich mehr Code sehen, um herauszufinden, was es ist, @Sundar hat einen guten Punkt, aber unmöglich ohne mehr Informationen zu wissen. 4GB ist ein guter Teil des Speichers, so dass es viele Zeilen oder Zeilen mit einer großen Menge an Daten wie BLOB-Bildern benötigen würde, um nicht genügend Arbeitsspeicher zu haben. – ArtisticPhoenix

Antwort

0

Sie können entweder von folgenden:

  1. Wenn Sie den Zugriff auf die Datei php.ini haben, ändern Sie die Zeile in der php.ini

    memory_limit = 128M ;

  2. Wenn Sie keinen Zugang zu PHP.ini versuchen diese .htaccess-Datei auf eine Zugabe:

    php_value memory_limit 128M

+0

ich habe das schon probiert. – chudasamachirag

0

nur Datensätze abrufen, die Sie in Ihre Anwendung müssen nicht alle Holen Sie alle Daten aus den Tabellen.

Vor

SELECT 
    p.*,l.*,u.*,ct.*,t.*,pc.* 
FROM 
    tbl_Product AS p 
    JOIN tbl_DistributorLocationId AS l ON p.fk_LocationId = l.pk_DistributorLocationId 
    JOIN tbl_Manufacturer AS m ON p.fk_Manufacturer = m.pk_ManufacturerId 
    LEFT JOIN tbl_Color AS c ON p.fk_Colors = c.pk_ColorId 
    LEFT JOIN tbl_Texture AS t ON p.fk_Texture = t.pk_TextureId 
    LEFT JOIN tbl_ProductLine AS pl ON p.fk_ProductLine = pl.pk_ProductLineId 
    LEFT JOIN tbl_States AS s ON l.fk_StateId = s.pk_StateId 
    LEFT JOIN tbl_Users AS u ON l.fk_UserId = u.pk_UserId 
    LEFT JOIN tbl_UserType AS ut ON u.fk_UserTypeId = ut.pk_UserTypeId 
    LEFT JOIN tbl_ProductCategories AS pc ON p.fk_CategoryId = pc.pk_CategoryId 
    LEFT JOIN tbl_CategoryType AS ct ON pc.fk_CategoryTypeId = ct.pk_CategoryTypeId 
where 
    1 = 1 
    AND p.boolean_status = 1 
ORDER BY 
    LOCATE('', varchar_Title), 
    LOCATE('', varchar_ProductLineText), 
    LOCATE('', varchar_ColorName), 
    LOCATE('', varchar_TextureName), 
    LOCATE('', text_Description), 
    LOCATE('', varchar_CategoryName), 
    LOCATE('', varchar_CategoryTypeName) 

Nach

SELECT 
    pc.pk_CategoryId, 
    pc.varchar_CategoryName, 
    c.pk_ColorId, 
    c.varchar_ColorName, 
    m.varchar_Title, 
    m.pk_ManufacturerId, 
    u.varchar_CompanyName, 
    u.pk_UserId, 
    pl.pk_ProductLineId, 
    pl.varchar_ProductLineText 
FROM 
    tbl_Product AS p 
    JOIN tbl_DistributorLocationId AS l ON p.fk_LocationId = l.pk_DistributorLocationId 
    JOIN tbl_Manufacturer AS m ON p.fk_Manufacturer = m.pk_ManufacturerId 
    LEFT JOIN tbl_Color AS c ON p.fk_Colors = c.pk_ColorId 
    LEFT JOIN tbl_Texture AS t ON p.fk_Texture = t.pk_TextureId 
    LEFT JOIN tbl_ProductLine AS pl ON p.fk_ProductLine = pl.pk_ProductLineId 
    LEFT JOIN tbl_States AS s ON l.fk_StateId = s.pk_StateId 
    LEFT JOIN tbl_Users AS u ON l.fk_UserId = u.pk_UserId 
    LEFT JOIN tbl_UserType AS ut ON u.fk_UserTypeId = ut.pk_UserTypeId 
    LEFT JOIN tbl_ProductCategories AS pc ON p.fk_CategoryId = pc.pk_CategoryId 
    LEFT JOIN tbl_CategoryType AS ct ON pc.fk_CategoryTypeId = ct.pk_CategoryTypeId 
where 
    1 = 1 
    AND p.boolean_status = 1 
ORDER BY 
    LOCATE('', varchar_Title), 
    LOCATE('', varchar_ProductLineText), 
    LOCATE('', varchar_ColorName), 
    LOCATE('', varchar_TextureName), 
    LOCATE('', text_Description), 
    LOCATE('', varchar_CategoryName), 
    LOCATE('', varchar_CategoryTypeName) 
+0

Limit anwenden und Batch-Prozess ausführen .., wenn es ein Bericht ist, geben Sie eine begrenzte Menge oder geben Sie eine Zusammenfassung der Informationen .. – Sundar

+0

Ich brauche alle Daten zur gleichen Zeit, so dass in dieser Partikel-Anwendung nicht möglich ist – chudasamachirag