Laravel-excel: 134217728バイトの許容メモリサイズが使い果たされました

作成日 2018年07月19日  ·  22コメント  ·  ソース: Maatwebsite/Laravel-Excel

前提条件

  • [X]コードの外部で動作を再現できるため、問題はLaravelExcelに限定されます。
  • [X]問題がまだ提出されていないことを確認しました。
  • [X]この問題を修正するPRが送信されていないかどうかを確認しました。

バージョン

  • PHPバージョン:7.1.13
  • Laravelバージョン:5.6
  • パッケージバージョン:^ 3.0

説明

私は取得していますAllowed memory size of 134217728 bytes exhausted私はエクスポートしようとすると、 FromQueryオプション

再現する手順

予想される行動:

問題を解決したい:)

実際の動作:

追加情報

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']);
    }
}

この画像を参照してくださいhttps://i.imgur.com/yMgUqXP.jpg

最も参考になるコメント

誰からの回答を期待しますか?

当社のソフトウェアは無料でオープンソースです。つまり、当社のソフトウェアの使用はオプションです。 当社は責任を負わず、支援する義務もありません。 ベストエフォートベースでサポートを提供します。

ソフトウェアを商用で使用していて、入念なサポートが必要な場合、または緊急に必要な場合は、商用ベースで提供できます。 [email protected]連絡7449312でお問い合わせください。

全てのコメント22件

誰かが私を助けることができますか?

4日。 答えなし:-(

誰からの回答を期待しますか?

当社のソフトウェアは無料でオープンソースです。つまり、当社のソフトウェアの使用はオプションです。 当社は責任を負わず、支援する義務もありません。 ベストエフォートベースでサポートを提供します。

ソフトウェアを商用で使用していて、入念なサポートが必要な場合、または緊急に必要な場合は、商用ベースで提供できます。 [email protected]連絡7449312でお問い合わせください。

OKなので、この問題を閉じないでください。 多分誰かがこれを修正することができます。

ありがとう

これはphpメモリの問題だと思います。データが多すぎてメモリがオーバーフローしている可能性があります...ライブラリとは関係ありません。

@jlcarpioe私はほぼ20万行あります。 シートに行を追加すると問題が発生します

php.iniでmemory_limitを最大化しようとしましたか?

@ bagana89それは良い解決策ではありません

私はあなたの問題を再現することはできません。 共有したコードを使用して、300K行のユーザーテーブルをエクスポートできます。 PhpSpreadsheetは毎回大きくなるワークブックを開かなければならないため、すべてのジョブでメモリ使用量が増加することに注意してください。 このプロセスにさらにメモリを割り当てることには何の問題もありません。 割り当てられているメモリが少ないようです。そのため、すぐにオーバーフローします。

ShouldAutoSizeを削除すると、すべてのジョブでブックの列のディメンションが再計算されるため、削除することをお勧めします。 これは、使用しない場合よりもはるかに多くのメモリを必要とします。

1 GBのRAMが割り当てられていますが、saeedvaziryと同じ結果が得られます。
v2.1からv3.1に移行したばかりです。 移行する動機となったv2.1でも同じ問題が発生していましたが、問題は解決しませんでした。 v2.1でのExcel :: createは、出力のスタイル設定もはるかに簡単でした。

(FromQueryを使用して)エクスポートする場合、チャンクはうまく機能しないようです(大量のメモリを使用します-約200kレコードで最大3ギガ)。 ただし、インポートはチャンクを使用して正常に機能します。 (メモリが50MBを超えることはありません)

私は15000のレコードしか持っておらず、同じエラーが発生しました。 私に何ができる?

これはエラーです:

[2019-11-24 22:39:59] local.ERROR:許可されたメモリサイズ134217728バイトが使い果たされました(18874368バイトを割り当てようとしました){"例外": "[オブジェクト](Symfony \ Component \ Debug \ Exception \ FatalErrorException(コード:1):C:\ wamp64 \ www \ ..... \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php:421で、134217728バイトの許容メモリサイズが使い果たされました(18874368バイトを割り当てようとしました) )
[スタックトレース]

0 {メイン}

"}

php.iniで許可されるメモリ制限を増やすか、ini_setを使用して動的に設定する必要があります

私は1Gを持っていますが、機能しません

プロセスを実行すると、php-cliプロセスはどのくらいのメモリを消費しますか? それは1ギガを超えている必要があります

メモリ制限は間違いなく問題ではありません。 phpinfoによると4GBに設定されていますが、まだこの問題があります。

私は同じ問題を抱えています

「ソリューション」は、ファイルを複数のファイルに分割し、それらの間のメモリを解放してから、すべてのファイルをマージし、マージされたファイルを応答として送信します。

短所:

  • 一時ファイル用のより多くのスペース
  • より多くの時間を費やしました(非インテリジェントループ)
  • より多くのコードが必要です(すぐに使用できるものではありません)

長所:

  • できます

同じ問題、メモリ制限は512 MB、4K行です

最終的解決
これは古いですが、今これを読んでいる人は誰でもそれを知っているはずです
ToModelまたはToCollectionをインポートまたはエクスポートする場合、そのプロセスでは、変換するために大量のメモリを割り当てる必要があります。
データをコレクションや配列などの使用可能な形式に変換します。

その場合、ToModelまたはToCollectを実装しないでください。プロセスをバイパスし、OnEachRowを実装して手動で操作を実行する必要があります。
これにより、ExcelのRowオブジェクトを渡すonRowメソッドを実装できます。 WithHeadingRowを実装して、連想配列として構造化することもできます。
この$ row-> toArray()を使用してデータを取得し、必要に応じて処理します。 これは高速で操作が簡単です。

PS:それでもメモリ制限エラーが発生する場合は、次のように最後の行にreturnステートメントを追加するだけです。
戻る;

ありがとうございました

同じ問題が発生し、 @ MoFoLuWaSoからの提案により、+ 128Mbのメモリ使用量を54Mbに減らしました。

1)DTOを実装します。 これにより、メモリ使用量が最も削減されました。
2)DTOのプロパティを注文し、 withMappingを削除します
3) ShouldAutoSize削除します

@saeedvzの場合、

namespace App\DataTransferObjects;

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

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;
            }
        );
    }
}
このページは役に立ちましたか?
0 / 5 - 0 評価