Saya mendapatkan Allowed memory size of 134217728 bytes exhausted
ketika saya mencoba mengekspor dengan opsi FromQuery
Perilaku yang diharapkan:
Saya ingin memperbaiki masalah saya :)
Perilaku sebenarnya:
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
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]
"}
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:
Kelebihan.:
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;
}
);
}
}
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.