FromQuery
μ΅μ
μΌλ‘ λ΄λ³΄λ΄κΈ°λ₯Ό μλνλ©΄ Allowed memory size of 134217728 bytes exhausted
λ©λλ€.
μμλλ λμ:
λ΄ λ¬Έμ λ₯Ό ν΄κ²°νκ³ μΆμ΄μ :)
μ€μ νλ:
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
μ무λ λλ₯Ό λμΈ μ μμ΅λκΉ?
4 μΌ. λ΅μ΄ μμ΅λλ€ :-(
λꡬμκ²μ λ΅μ κΈ°λν©λκΉ?
λΉμ¬ μννΈμ¨μ΄λ 무λ£μ΄λ©° μ€ν μμ€μ΄λ―λ‘ λΉμ¬ μννΈμ¨μ΄ μ¬μ©μ μ ν μ¬νμ λλ€. λΉμ¬λ μ΄λ ν μ± μλ μ§μ§ μμΌλ©° μ§μν μ무λ μμ΅λλ€. μ΅μ μ λ€ν΄ μ§μνκ² μ΅λλ€.
μννΈμ¨μ΄λ₯Ό μμ μ μΌλ‘ μ¬μ©νκ³ μ κ΅ν μ§μμ΄ νμνκ±°λ κΈ΄κΈνκ² νμν κ²½μ° μμ μ μΌλ‘ μ 곡ν μ μμ΅λλ€. [email protected] λλ μ ν +31 (0)10 744 9312λ‘ μ°λ½νμμμ€.
μκ² μ΅λλ€. μ΄ λ¬Έμ λ₯Ό λ«μ§ λ§μμμ€. λκ΅°κ°κ° μ΄κ²μ κ³ μΉ μ μμ΅λλ€.
κ°μ¬ ν΄μ
php λ©λͺ¨λ¦¬μ λ¬Έμ μΈκ² κ°μλ° λ°μ΄ν°κ° λ무λ§μμ λ©λͺ¨λ¦¬κ° λμΉ¨.. λΌμ΄λΈλ¬λ¦¬μ κ΄λ ¨μ΄ μμ΅λλ€.
@jlcarpioe κ±°μ 200k νμ΄ μμ΅λλ€. μνΈμ νμ μΆκ°ν λ λ¬Έμ κ° λ°μν©λλ€.
php.iniμμ memory_limitλ₯Ό μ΅λννλ €κ³ νμ΅λκΉ?
@bagana89 μ’μ ν΄κ²°μ± μ΄ μλλλ€.
κ·νμ λ¬Έμ λ₯Ό μ¬νν μ μμ΅λλ€. 곡μ νμ μ½λλ₯Ό μ¬μ©νμ¬ 300K νμ μ¬μ©μ ν μ΄λΈμ λ΄λ³΄λΌ μ μμ΅λλ€. PhpSpreadsheetλ λ§€λ² μ»€μ§κ³ μλ ν΅ν© λ¬Έμλ₯Ό μ΄μ΄μΌ νλ―λ‘ λͺ¨λ μμ μμ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°νλ€λ μ μ μ μνμμμ€. μ΄ νλ‘μΈμ€μ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ λ° μλ¬΄λ° λ¬Έμ κ° μμ΅λλ€. ν λΉλ λ©λͺ¨λ¦¬κ° λ§μ§ μμ κ² κ°μμ λ무 빨리 μ€λ²νλ‘λ©λλ€.
λͺ¨λ μμ
μμ ν΅ν© λ¬Έμ μ΄ μ°¨μμ λ€μ κ³μ°νλ―λ‘ ShouldAutoSize
λ₯Ό μμ νλ κ²μ΄ κ°μ₯ μ’μ΅λλ€. μ¬μ©νμ§ μλ κ²λ³΄λ€ ν¨μ¬ λ λ§μ λ©λͺ¨λ¦¬κ° νμν©λλ€.
1GBμ λ¨μ΄ ν λΉλμμ§λ§ μ¬μ ν saeedvaziryμ λμΌν κ²°κ³Όκ° λνλ©λλ€.
v2.1μμ v3.1λ‘ λ§μ΄κ·Έλ μ΄μ
νμ΅λλ€. λ§μ΄κ·Έλ μ΄μ
νλλ‘ λκΈ°λ₯Ό λΆμ¬ν v2.1κ³Ό λμΌν λ¬Έμ κ° μμμ§λ§ λ¬Έμ κ° ν΄κ²°λμ§ μμμ΅λλ€. v2.1μ Excel::createλ μΆλ ₯ μ€νμΌμ μ§μ νλ κ²μ΄ ν¨μ¬ λ μ¬μ μ΅λλ€.
(FromQueryλ₯Ό μ¬μ©νμ¬) λ΄λ³΄λΌ λ μ²ν¬κ° μ μλνμ§ μλ κ² κ°μ΅λλ€(λλμ λ©λͺ¨λ¦¬ μ¬μ© - μ½ 200,000κ°μ λ μ½λμ λν΄ μ΅λ 3Gig). κ·Έλ¬λ κ°μ Έμ€κΈ°λ μ²νΉμ μ¬μ©νμ¬ μ μλν©λλ€. (λ©λͺ¨λ¦¬λ 50MBλ₯Ό μ΄κ³Όνμ§ μμ΅λλ€)
λλ 15,000 κ°μ λ μ½λ λ§ κ°μ§κ³ μμΌλ©° λμΌν μ€λ₯κ° λ°μνμ΅λλ€. μ΄λ‘ν΄?
μ΄κ²μ μ€λ₯μ λλ€:
[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λ°μ΄νΈ ν λΉ μλ). )
[μ€ν μΆμ ]
"}
php.iniμμ νμ©λλ λ©λͺ¨λ¦¬ μ νμ λ리거λ ini_setμ μ¬μ©νμ¬ λμ μΌλ‘ μ€μ ν΄μΌ ν©λλ€.
1Gλ₯Ό κ°μ§κ³ μμ§λ§ μλνμ§ μμ΅λλ€
νλ‘μΈμ€λ₯Ό μ€νν λ php-cli νλ‘μΈμ€κ° μλΉνλ λ©λͺ¨λ¦¬λ μΌλ§μ λκΉ? κ·Έλ¬λ©΄ 1Gig μ΄μμ΄μ΄μΌ ν©λλ€.
λ©λͺ¨λ¦¬ μ νμ νμ€ν λ¬Έμ κ° μλλλ€. phpinfoμ λ°λ₯΄λ©΄ 4GBλ‘ μ€μ λμ΄ μλλ° μ¬μ ν μ΄ λ¬Έμ κ° μμ΅λλ€.
λλ κ°μ λ¬Έμ κ°μλ€
'μ루μ 'μ νμΌμ μ¬λ¬ νμΌλ‘ λΆν νμ¬ κ·Έ μ¬μ΄μ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν λ€μ λͺ¨λ νμΌμ λ³ν©νκ³ λ³ν©λ μλ΅μ 보λ λλ€.
λ¨μ :
μ₯μ :
λμΌν λ¬Έμ , λ©λͺ¨λ¦¬ μ νμ 512MB, 4K νμ λλ€.
λ§μ§λ§ ν΄κ²°μ±
μ΄κ²μ μ€λλ κ²μ΄μ§λ§ μ§κΈ μ΄ κΈμ μ½κ³ μλ μ¬λμ μ κ²μ΄λ€.
ToModel λλ ToCollectionμ κ°μ Έμ€κ±°λ λ΄λ³΄λ΄λ κ²½μ° ν΄λΉ νλ‘μΈμ€μλ λ³νμ μν΄ λ§λν λ©λͺ¨λ¦¬ ν λΉμ΄ νμν©λλ€.
λ°μ΄ν°λ₯Ό 컬λ μ
λλ λ°°μ΄κ³Ό κ°μ μ¬μ© κ°λ₯ν νμμΌλ‘ λ³νν©λλ€.
μ΄ κ²½μ° ToModel λλ ToCollectλ₯Ό ꡬννμ§ μκ³ νλ‘μΈμ€λ₯Ό μ°ννκ³ OnEachRowλ₯Ό ꡬννμ¬ μλμΌλ‘ μμ
μ μνν΄μΌ ν©λλ€.
Excel Row κ°μ²΄λ₯Ό μ λ¬ν onRow λ©μλλ₯Ό ꡬνν μ μμ΅λλ€. WithHeadingRowλ₯Ό ꡬννμ¬ μ°κ΄ λ°°μ΄λ‘ ꡬμ±ν μ μμ΅λλ€.
μ΄ $row->toArray()λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ»κ³ μνλ λλ‘ μ²λ¦¬νμμμ€. λΉ λ₯΄κ³ μ½κ² μ‘°μν μ μμ΅λλ€.
μΆμ : μ¬μ ν λ©λͺ¨λ¦¬ μ ν μ€λ₯κ° λ°μνλ©΄ λ€μκ³Ό κ°μ΄ λ§μ§λ§ μ€μ return λ¬Έμ μΆκ°νκΈ°λ§ νλ©΄ λ©λλ€.
λ°ν;
κ°μ¬ ν΄μ
λλ κ°μ λ¬Έμ κ° μμκ³ @MoFoLuWaSo μ μ μμΌλ‘ +128Mb λ©λͺ¨λ¦¬ μ¬μ©λμ 54Mbλ‘ μ€μμ΅λλ€.
1) DTOλ₯Ό ꡬνν©λλ€. λ©λͺ¨λ¦¬ μ¬μ©λμ κ°μ₯ λ§μ΄ μ€μμ΅λλ€.
2) DTOμ μμ±μ μ£Όλ¬Ένκ³ withMapping
μ κ±°ν©λλ€.
3) ShouldAutoSize
μ κ±°
@saedvzμ κ²½μ° λ€μκ³Ό κ°μμΌ ν©λλ€.
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;
}
);
}
}
κ°μ₯ μ μ©ν λκΈ
λꡬμκ²μ λ΅μ κΈ°λν©λκΉ?
λΉμ¬ μννΈμ¨μ΄λ 무λ£μ΄λ©° μ€ν μμ€μ΄λ―λ‘ λΉμ¬ μννΈμ¨μ΄ μ¬μ©μ μ ν μ¬νμ λλ€. λΉμ¬λ μ΄λ ν μ± μλ μ§μ§ μμΌλ©° μ§μν μ무λ μμ΅λλ€. μ΅μ μ λ€ν΄ μ§μνκ² μ΅λλ€.
μννΈμ¨μ΄λ₯Ό μμ μ μΌλ‘ μ¬μ©νκ³ μ κ΅ν μ§μμ΄ νμνκ±°λ κΈ΄κΈνκ² νμν κ²½μ° μμ μ μΌλ‘ μ 곡ν μ μμ΅λλ€. [email protected] λλ μ ν +31 (0)10 744 9312λ‘ μ°λ½νμμμ€.