Laravel-excel: تم استنفاذ حجم الذاكرة المسموح بها وهو 134217728 بايتس

تم إنشاؤها على ١٩ يوليو ٢٠١٨  ·  22تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

المتطلبات الأساسية

  • [X] قادر على إعادة إنتاج السلوك خارج التعليمات البرمجية الخاصة بك ، يتم عزل المشكلة في Laravel Excel.
  • [X] تم التحقق من عدم تقديم مشكلتك بالفعل.
  • [X] تم الفحص إذا لم يتم تقديم العلاقات العامة التي تعمل على حل هذه المشكلة.

إصدارات

  • إصدار 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] أو عبر الهاتف +31 (0) 10744 9312.

ال 22 كومينتر

هل يستطيع أي أحد مساعدتي؟

4 أيام. لا اجابة :-(

من الذي تتوقع الجواب من؟

برنامجنا مجاني ومفتوح المصدر ، مما يعني أن استخدام برنامجنا اختياري. نحن لا نتحمل أي مسؤولية وليس هناك التزام بالدعم. سوف نقدم الدعم على أساس أفضل جهد.

إذا كنت تستخدم البرنامج تجاريًا وتحتاج إلى دعم تفصيلي أو تحتاج إليه بشكل عاجل ، فيمكننا تقديم ذلك على أساس تجاري. يرجى الاتصال [email protected] أو عبر الهاتف +31 (0) 10744 9312.

حسنًا ، لذا من فضلك لا تغلق هذه المشكلة. ربما يمكن لشخص ما إصلاح هذا.

شكرا

أعتقد أنها مشكلة في ذاكرة php ، ربما يكون هناك الكثير من البيانات وتجاوز الذاكرة ... ليس هناك علاقة بالمكتبة.

jlcarpioe لدي ما يقرب من 200 ألف صف. تحدث المشكلة عند إلحاق الصفوف بالورقة

هل حاولت تكبير memory_limit في ملف php.ini؟

@ bagana89 هذا ليس حلا جيدا

لا أستطيع إعادة إنتاج مشكلتك. أنا قادر على تصدير جدول مستخدمين يتكون من 300 ألف صف باستخدام الرمز الذي شاركته. لاحظ أن استخدام الذاكرة سيزداد في كل وظيفة حيث يجب أن يفتح PhpSpreadsheet المصنف الذي يزداد حجمه في كل مرة. لا حرج في تخصيص المزيد من الذاكرة لهذه العملية. يبدو أنه ليس لديك الكثير من الذاكرة المخصصة ، ولهذا السبب تفيض بسرعة كبيرة.

من الأفضل إسقاط ShouldAutoSize حيث سيؤدي ذلك إلى إعادة حساب أبعاد عمود المصنفات في كل وظيفة. هذا يأخذ ذاكرة أكثر بكثير من دون استخدامه.

لدي 1 غيغابايت من ذاكرة الوصول العشوائي المخصصة وما زلت أحصل على نفس نتيجة سعيد فزيري.
انتقلت للتو من الإصدار 2.1 إلى الإصدار 3.1. كنت أواجه نفس المشكلة مع الإصدار 2.1 الذي دفعني للهجرة ، لكن لم يحل المشكلة. كان Excel :: إنشاء في v2.1 أسهل بكثير لتصميم الإخراج أيضًا.

يبدو أن التقسيم لا يعمل بشكل جيد عند التصدير (باستخدام FromQuery) (يستخدم قدرًا هائلاً من الذاكرة - ما يصل إلى 3 العربات بالنسبة لي لحوالي 200 ألف سجل). لكن الاستيراد يعمل بشكل جيد باستخدام التقطيع. (الذاكرة لا تتجاوز 50 ميغا بايت)

لدي 15 ألف سجل فقط وأعطيتني نفس الخطأ. ماذا بإمكاني أن أفعل؟

هذا هو الخطأ:

[2019-11-24 22:39:59] local.ERROR: تم استنفاد حجم الذاكرة المسموح به وهو 134217728 بايت (حاول تخصيص 18874368 بايت) {"استثناء": "[كائن] (Symfony \ Component \ Debug \ Exception \ FatalErrorException ( الكود: 1): استنفاد حجم الذاكرة المسموح به وهو 134217728 بايت (حاول تخصيص 18874368 بايت) في C: \ wamp64 \ www \ ..... \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php: 421 )
[تتبع المكدس]

0 {رئيسي}

"}

ستحتاج إلى زيادة حد الذاكرة المسموح به في ملف php.ini أو تعيينه ديناميكيًا باستخدام ini_set

فعلت ، لدي 1G لكنها لا تعمل

عند تشغيل العملية ، ما مقدار الذاكرة التي تستهلكها عملية php-cli؟ ثم يجب أن يتجاوز 1 جيجا

الحد الأقصى للذاكرة بالتأكيد ليس هو المشكلة. تم ضبطه على 4 غيغابايت وفقًا لـ phpinfo وما زلت أعاني من هذه المشكلة.

لدي نفس المشكلة

يقسم "الحل" ملفك إلى عدة ملفات ، مع تحرير الذاكرة بينها ، ثم دمج جميع الملفات وإرسالها مدمجة كاستجابة.

سلبيات.:

  • مساحة أكبر للملفات المؤقتة
  • قضاء المزيد من الوقت (الحلقات غير الذكية)
  • مطلوب المزيد من الكود (غير جاهز)

الايجابيات:

  • إنها تعمل

نفس المشكلة ، الحد الأقصى للذاكرة هو 512 ميجا بايت ، صفوف 4K

حل نهائي
هذا قديم ، لكن من يقرأ هذا الآن يجب أن يعرف ذلك
إذا كنت تقوم باستيراد أو تصدير ToModel أو ToCollection ، فإن هذه العملية تتطلب تخصيصًا كبيرًا للذاكرة للتحويل
البيانات في أشكال قابلة للاستخدام مثل التجميع أو المصفوفة.

في هذه الحالة ، لا تطبق ToModel أو ToCollect ، فأنت بحاجة إلى تجاوز العملية وتنفيذ العملية يدويًا عن طريق تطبيق OnEachRow
والتي تسمح لك بتنفيذ طريقة onRow التي ستمرر في كائن Excel Row. يمكنك أيضًا تنفيذ WithHeadingRow لجعله منظمًا كمصفوفة ترابطية.
استخدم هذا $ row-> toArray () للحصول على بياناتك ومعالجتها كما تريد. هذا سريع وسهل التلاعب به.

ملاحظة: إذا استمر ظهور خطأ حد الذاكرة ، فما عليك سوى إضافة عبارة إرجاع إلى السطر الأخير مثل هذا
إرجاع؛

اشكرك

واجهت نفس المشكلة ومع الاقتراحات من MoFoLuWaSo قمت بتقليل استخدام الذاكرة + 128 ميجا بايت إلى 54 ميجا بايت.

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 التقييمات