Laravel-excel: Ukuran memori yang diizinkan 134217728 byte habis

Dibuat pada 19 Jul 2018  ·  22Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

  • [X] Mampu mereproduksi perilaku di luar kode Anda, masalahnya diisolasi ke Laravel Excel.
  • [X] Memeriksa bahwa masalah Anda belum diajukan.
  • [X] Diperiksa jika tidak ada PR yang dikirimkan yang memperbaiki masalah ini.

Versi

  • Versi PHP: 7.1.13
  • Versi Laravel: 5.6
  • Versi paket: ^3.0

Keterangan

Saya mendapatkan Allowed memory size of 134217728 bytes exhausted ketika saya mencoba mengekspor dengan opsi FromQuery

Langkah-langkah untuk Reproduksi

Perilaku yang diharapkan:

Saya ingin memperbaiki masalah saya :)

Perilaku sebenarnya:

informasi tambahan

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

Lihat gambar ini https://i.imgur.com/yMgUqXP.jpg

Komentar yang paling membantu

Anda mengharapkan jawaban dari siapa?

Perangkat lunak kami gratis dan open source, artinya penggunaan perangkat lunak kami bersifat opsional. Kami tidak bertanggung jawab dan tidak ada kewajiban untuk mendukung. Kami akan memberikan dukungan atas dasar upaya terbaik.

Jika Anda menggunakan perangkat lunak secara komersial dan membutuhkan dukungan yang rumit atau sangat membutuhkannya, kami dapat menawarkannya secara komersial. Silakan hubungi [email protected] atau melalui telepon +31 (0)10 744 9312.

Semua 22 komentar

Ada yang bisa bantu saya?

4 hari. tidak ada Jawaban :-(

Anda mengharapkan jawaban dari siapa?

Perangkat lunak kami gratis dan open source, artinya penggunaan perangkat lunak kami bersifat opsional. Kami tidak bertanggung jawab dan tidak ada kewajiban untuk mendukung. Kami akan memberikan dukungan atas dasar upaya terbaik.

Jika Anda menggunakan perangkat lunak secara komersial dan membutuhkan dukungan yang rumit atau sangat membutuhkannya, kami dapat menawarkannya secara komersial. Silakan hubungi [email protected] atau melalui telepon +31 (0)10 744 9312.

Oke jadi tolong jangan tutup masalah ini. mungkin seseorang bisa memperbaiki ini.

Terima kasih

Saya pikir ini masalah memori php, mungkin terlalu banyak data dan meluap memori ... Tidak ada hubungan dengan perpustakaan.

@jlcarpioe Saya memiliki hampir 200 ribu baris. Masalah terjadi saat menambahkan baris ke sheet

Apakah Anda mencoba memaksimalkan memory_limit di php.ini?

@bagana89 Itu bukan solusi yang bagus

Saya tidak dapat mereproduksi masalah Anda. Saya dapat mengekspor tabel pengguna dengan 300 ribu baris menggunakan kode yang Anda bagikan. Perhatikan bahwa penggunaan memori akan meningkat di setiap pekerjaan karena PhpSpreadsheet harus membuka buku kerja yang semakin besar setiap saat. Tidak ada yang salah dengan menugaskan lebih banyak memori untuk proses ini. Sepertinya Anda tidak memiliki banyak memori yang ditetapkan, itu sebabnya ia meluap begitu cepat.

Sebaiknya hapus ShouldAutoSize karena itu akan menghitung ulang dimensi kolom buku kerja di setiap pekerjaan. Itu membutuhkan lebih banyak memori daripada tanpa menggunakannya.

Saya memiliki 1 GB ram yang dialokasikan dan masih memiliki hasil yang sama dengan saeedvaziry.
Baru saja bermigrasi dari v2.1 ke v3.1. Mengalami masalah yang sama dengan v2.1 yang memotivasi saya untuk bermigrasi, tetapi tidak menyelesaikan masalah. Excel::create di v2.1 juga jauh lebih mudah untuk menata output.

Tampaknya chunking tidak berfungsi dengan baik saat mengekspor (menggunakan FromQuery) (menggunakan sejumlah besar memori - hingga 3 Gigs bagi saya untuk sekitar 200 ribu catatan). Tetapi mengimpor berfungsi dengan baik menggunakan chunking. (memori tidak pernah melebihi 50MB)

Saya hanya memiliki 15 ribu catatan dan memberi saya kesalahan yang sama. Apa yang dapat saya?

Ini adalah kesalahannya:

[2019-11-24 22:39:59] local.ERROR: Ukuran memori yang diizinkan 134217728 byte habis (mencoba mengalokasikan 18874368 byte) {"exception":"[object] (Symfony\Component\Debug\Exception\FatalErrorException( kode: 1): Ukuran memori yang diizinkan 134217728 byte habis (mencoba mengalokasikan 18874368 byte) di C:\wamp64\www\.....\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Collection\Cells.php:421 )
[stacktrace]

0 {utama}

"}

Anda perlu meningkatkan batas memori yang diizinkan di php.ini Anda atau mengaturnya secara dinamis menggunakan ini_set

Ya, saya punya 1G tetapi tidak berfungsi

Saat Anda menjalankan proses, berapa banyak memori yang digunakan oleh proses php-cli? Itu harus melebihi 1Gig kalau begitu

Batas memori jelas bukan masalah. Ini diatur ke 4GB menurut phpinfo dan saya masih memiliki masalah ini.

saya punya masalah yang sama

'Solusi' akan membagi file Anda menjadi beberapa file, melepaskan memori di antara mereka, dan kemudian menggabungkan semua file dan mengirim gabungan sebagai respons.

Kontra:

  • Lebih banyak ruang untuk file sementara
  • Lebih banyak waktu yang dihabiskan (loop tidak cerdas)
  • Lebih banyak kode diperlukan (tidak out-of-the-box)

Kelebihan.:

  • Berhasil

masalah yang sama, batas memori adalah 512 MB, baris 4K

Solusi akhir
Ini sudah tua, tetapi siapa pun yang membaca ini sekarang harus tahu itu
jika Anda mengimpor atau mengekspor ToModel atau ToCollection, proses itu membutuhkan alokasi memori yang besar untuk mengonversi
data ke dalam bentuk yang dapat digunakan seperti koleksi atau array.

Dalam hal ini tidak mengimplementasikan ToModel atau ToCollect, Anda harus melewati proses dan melakukan operasi secara manual dengan mengimplementasikan OnEachRow
yang memungkinkan Anda untuk mengimplementasikan metode onRow yang akan melewati objek Baris Excel. Anda juga dapat mengimplementasikan WithHeadingRow agar terstruktur sebagai array asosiatif.
Gunakan $row->toArray() ini untuk mendapatkan data Anda dan memprosesnya sesuka Anda. Ini cepat dan mudah untuk dimanipulasi.

PS: Jika Anda masih mendapatkan Kesalahan Batas Memori, cukup tambahkan pernyataan kembali ke baris terakhir seperti ini
kembali;

Terima kasih

Saya memiliki masalah yang sama dan dengan saran dari @MoFoLuWaSo saya mengurangi penggunaan memori 128Mb saya menjadi 54Mb.

1) menerapkan DTO. Itu paling banyak mengurangi penggunaan memori.
2) pesan properti DTO dan hapus withMapping
3) hapus ShouldAutoSize

Dalam kasus @saeedvz seharusnya terlihat seperti ini:

namespace App\DataTransferObjects;

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

dan

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;
            }
        );
    }
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat