Laravel Excel::toCollection 占用太多内存

问题描述 投票:0回答:1

我需要编写一个类,从 Excel 文件中获取数据,解析它,然后将其上传到在线商店。不过没关系,我的第一步有问题 - 以良好的方式从 Excel 文件加载数据。如上所述,我使用 Laravel Excel。我有一个 35mb、12451 行的 Excel 文件,可以通过这种方式简单加载它:

        $filePath = '../public/New_Products_2022-12-23.xlsx';
        $import = Excel::toCollection([], $filePath);
        $memoryUsage = memory_get_peak_usage(true);
        $memoryUsageInMegabytes = round($memoryUsage / 1024 / 1024, 2);
        
        dump($memoryUsageInMegabytes);
        dd($import);

返回这个:

198.0 // app/Http/Controllers/Ignored/TestController.php:28

array:1 [▼ // app/Http/Controllers/Ignored/TestController.php:29
  0 => array:12451 [▶]
]

加载此文件花费了 21.97 秒和 198MB 的 RAM(这不是问题,但如果出现 100000 行的文件,那就是问题了)。我的问题是,有没有办法像 Laravel Model::chunk 一样解决这个问题?我在 Laravel excel 文档 (https://docs.laravel-excel.com/3.1/imports/chunk-reading.html) 中偶然发现了 Chunk Reading,但在这种情况下它连接到了 UsersImport 模型,我可以做什么不这样做,因为我需要先解析我的数据,然后才能上传它。所以我不想使用任何导入,我只想分块获取数据,解析它并返回。有没有办法使用 Laravel Excel 来做到这一点?我知道使用收益生成器,但据我所知,这将涉及不使用 Laravel excel。

我尝试从 Excel 文件获取数据,解析它,然后通过 API 将其更新到我的商店网站。

php excel laravel
1个回答
0
投票

我认为你不能用这个库做到这一点。 Laravel Excel 使用 PhpSpreadsheet,这是一个非常“贪吃”的库。所以我建议你选择另一个库,例如avadim/fast-excel-reader,在它的帮助下你可以将数据读入数组,处理它然后写入数据库

$excel = Excel::open($file);
$sheet = $excel->sheet();
foreach ($sheet->nextRow() as $rowNum => $rowData) {
    // $rowData is array ['A' => ..., 'B' => ...]
    // handling of $rowData here
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.