Laravel-excel: Zulässige Speichergröße von 134217728 Byte erschöpft

Erstellt am 19. Juli 2018  ·  22Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

  • [X] In der Lage, das Verhalten außerhalb Ihres Codes zu reproduzieren, ist das Problem auf Laravel Excel isoliert.
  • [X] Es wurde überprüft, ob Ihr Problem nicht bereits eingereicht wurde.
  • [X] Geprüft, wenn keine PR eingereicht wurde, die dieses Problem behebt.

Versionen

  • PHP-Version: 7.1.13
  • Laravel-Version: 5.6
  • Paketversion: ^3.0

Beschreibung

Ich erhalte Allowed memory size of 134217728 bytes exhausted wenn ich versuche, mit der Option FromQuery zu exportieren

Schritte zum Reproduzieren

Erwartetes Verhalten:

Ich möchte mein Problem beheben :)

Tatsächliches Verhalten:

Weitere Informationen

namespace App\Exports;

use App\OldTransaction;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Http\Request;
use jDate;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

class OldDepositExport implements FromQuery, ShouldQueue, WithMapping, WithHeadings, ShouldAutoSize
{
    use Exportable;

    /**
     * DepositExport constructor.
     * <strong i="27">@param</strong> Request $request
     */
    public function __construct(Request $request)
    {
    }

    public function headings(): array
    {
        return [
            'ID',
        ];
    }


    public function map($transaction): array
    {
        return [
            $transaction->id,
        ];
    }

    public function query()
    {
        return User::query()
            ->where('status', '=', 1)
            ->select(['id']);
    }
}

Siehe dieses Bild https://i.imgur.com/yMgUqXP.jpg

Hilfreichster Kommentar

Von wem erwarten Sie eine Antwort?

Unsere Software ist kostenlos und Open Source, d.h. die Nutzung unserer Software ist optional. Wir übernehmen keine Haftung und es besteht keine Verpflichtung zum Support. Wir unterstützen Sie nach bestem Wissen und Gewissen.

Wenn Sie die Software gewerblich nutzen und aufwendigen Support benötigen oder dringend benötigen, können wir diesen auch kommerziell anbieten. Bitte kontaktieren Sie [email protected] oder telefonisch unter +31 (0)10 744 9312.

Alle 22 Kommentare

Kann mir jemand helfen?

4 Tage. keine Antwort :-(

Von wem erwarten Sie eine Antwort?

Unsere Software ist kostenlos und Open Source, d.h. die Nutzung unserer Software ist optional. Wir übernehmen keine Haftung und es besteht keine Verpflichtung zum Support. Wir unterstützen Sie nach bestem Wissen und Gewissen.

Wenn Sie die Software gewerblich nutzen und aufwendigen Support benötigen oder dringend benötigen, können wir diesen auch kommerziell anbieten. Bitte kontaktieren Sie [email protected] oder telefonisch unter +31 (0)10 744 9312.

OK, also bitte dieses Problem nicht schließen. vielleicht kann das jemand beheben.

Vielen Dank

Ich denke, es ist ein Problem des PHP-Speichers, vielleicht sind es zu viele Daten und der Speicher überläuft ... Es hat keine Beziehung zur Bibliothek.

@jlcarpioe Ich habe fast 200.000 Zeilen. Das Problem tritt beim Anhängen von Zeilen an das Blatt auf

Hast du versucht, memory_limit in php.ini zu maximieren?

@bagana89 Das ist keine gute Lösung

Ich kann dein Problem nicht reproduzieren. Ich kann mit dem von Ihnen freigegebenen Code eine Benutzertabelle mit 300.000 Zeilen exportieren. Beachten Sie, dass der Speicherverbrauch bei jedem Job steigt, da PhpSpreadsheet die Arbeitsmappe öffnen muss, die jedes Mal größer wird. Es ist nichts falsch daran, diesem Prozess etwas mehr Speicher zuzuweisen. Es scheint, dass Ihnen nicht viel Speicher zugewiesen ist, deshalb läuft er so schnell über.

Lassen Sie am besten ShouldAutoSize weg, da dadurch die Dimensionen der Arbeitsmappenspalten in jedem Job neu berechnet werden. Das braucht viel mehr Speicher als ohne es zu verwenden.

Ich habe 1 GB RAM zugewiesen und habe immer noch das gleiche Ergebnis wie saeedvaziry.
Gerade von v2.1 auf v3.1 migriert. Hatte das gleiche Problem mit v2.1, das mich zur Migration motivierte, aber das Problem nicht löste. Excel::create in v2.1 war auch viel einfacher, die Ausgabe zu stylen.

Es scheint, dass das Chunking beim Exportieren (mit FromQuery) nicht gut funktioniert (verwendet eine enorme Menge an Speicher - bis zu 3 Gigs für mich für etwa 200.000 Datensätze). Aber das Importieren funktioniert gut mit Chunking. (Speicher überschreitet nie 50 MB)

Ich habe nur 15 Tausend Datensätze und habe mir den gleichen Fehler gegeben. Was kann ich tun?

Dies ist der Fehler:

[2019-11-24 22:39:59] local.ERROR: Zulässige Speichergröße von 134217728 Byte erschöpft (versucht, 18874368 Byte zuzuweisen) {"Exception":"[Objekt] (Symfony\Component\Debug\Exception\FatalErrorException( Code: 1): Erlaubte Speichergröße von 134217728 Bytes erschöpft (versucht, 18874368 Bytes zuzuordnen) unter C:\wamp64\www\.....\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Collection\Cells.php:421 )
[Stacktrace]

0 {Haupt}

"}

Sie müssen das zulässige Speicherlimit in Ihrer php.ini erhöhen oder dynamisch mit ini_set einstellen

Ich habe, ich habe 1G, aber es funktioniert nicht

Wie viel Speicher verbraucht der php-cli-Prozess, wenn Sie den Prozess ausführen? Es muss dann 1 Gig überschreiten

Das Speicherlimit ist definitiv nicht das Problem. Laut phpinfo ist es auf 4 GB eingestellt und ich habe immer noch dieses Problem.

ich habe das gleiche problem

Eine "Lösung" würde Ihre Datei in mehrere aufteilen, Speicher zwischen ihnen freigeben und dann alle Dateien zusammenführen und als Antwort zusammengeführt senden.

Nachteile:

  • Mehr Platz für temporäre Dateien
  • Mehr Zeitaufwand (nicht intelligente Schleifen)
  • Mehr Code erforderlich (nicht standardmäßig)

Vorteile:

  • Es klappt

das gleiche Problem, das Speicherlimit beträgt 512 MB, 4K Zeilen

Endgültige Lösung
Das ist alt, aber wer das jetzt liest, sollte das wissen
Wenn Sie ToModel oder ToCollection importieren oder exportieren, erfordert dieser Vorgang eine große Speicherzuweisung für die Konvertierung
die Daten in verwendbare Formen wie Sammlung oder Array.

In diesem Fall müssen Sie ToModel oder ToCollect nicht implementieren, Sie müssen den Prozess umgehen und den Vorgang manuell ausführen, indem Sie OneEachRow implementieren
mit denen Sie die onRow-Methode implementieren können, die ein Excel Row-Objekt übergibt. Sie können WithHeadingRow mit implementieren, um es als assoziatives Array strukturiert zu haben.
Verwenden Sie dieses $row->toArray(), um Ihre Daten abzurufen und nach Belieben zu verarbeiten. Dies ist schnell und einfach zu manipulieren.

PS: Wenn Sie immer noch den Memory Limit Error erhalten, fügen Sie einfach eine return-Anweisung wie folgt in die letzte Zeile ein
Rückkehr;

Danke schön

Ich hatte das gleiche Problem und mit den Vorschlägen von @MoFoLuWaSo habe ich meine Speichernutzung von MB reduziert.

1) Implementieren eines DTO. Das hat den Speicherverbrauch am meisten reduziert.
2) Ordne die Eigenschaften des DTO und entferne withMapping
3) entfernen ShouldAutoSize

Im Fall von @saeedvz sollte es so aussehen:

namespace App\DataTransferObjects;

class OldDepositRow
{
    public int $id;
    public string $created_at;
}

und

namespace App\Exports;

use App\DataTransferObjects\OldDepositRow;

class OldDepositExport implements FromCollection, ShouldQueue, WithHeadings
{
    use Exportable;

    public function headings(): array
    {
        return [
            'ID',
        ];
    }

    public function collection()
    {
        $users = User::query()
            ->where('status', '=', 1)
            ->select(['id']);

        return $users->map(
           function ($user) {
                $row = new OldDepositRow();
                $row->transaction_id = $user->transaction->id;

                // cast objects like Carbon or BigDecimal to string
                $row->created_at = $user->transaction->created_at->format('d-m-Y');

                return $row;
            }
        );
    }
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen