Php Laravel—将数据排序并导出到CSV的更好方法
我正在使用Laravel处理一个项目,我目前有一个cron来处理数据并生成2个CSV文件:1个已排序(调用文件a),另1个未排序(文件B) 每个文件大约10mb,cron每天都会被触发,我们不需要数据库来存储结果 我目前正在做这样的事情:Php Laravel—将数据排序并导出到CSV的更好方法,php,laravel,sorting,csv,memory,Php,Laravel,Sorting,Csv,Memory,我正在使用Laravel处理一个项目,我目前有一个cron来处理数据并生成2个CSV文件:1个已排序(调用文件a),另1个未排序(文件B) 每个文件大约10mb,cron每天都会被触发,我们不需要数据库来存储结果 我目前正在做这样的事情: Cron运行并将所有结果存储到数据库中的临时表中 完成该过程后,从该表中读取数据并写入文件B(无排序的正常文件) 然后,再次运行另一个查询,从表中获取排序后的数据,然后写入文件A 之后,清空临时表 因为结果数据太大,无法存储为数组(内存不足),所以我们最终
- Cron运行并将所有结果存储到数据库中的临时表中
- 完成该过程后,从该表中读取数据并写入文件B(无排序的正常文件)
- 然后,再次运行另一个查询,从表中获取排序后的数据,然后写入文件A
- 之后,清空临时表
use App\Models\Flight;
foreach (Flight::where('destination', 'Zurich')->cursor() as $flight) {
// write the record in your csv file
}
您可以在此处找到更多文档:我们使用游标解决了将大数据导出为csv时出现的一些“内存不足”错误。
“内存不足”发生在经典的雄辩方法(Model::where(…)->get()和chunk函数中。
您可以通过以下方式使用光标:
use App\Models\Flight;
foreach (Flight::where('destination', 'Zurich')->cursor() as $flight) {
// write the record in your csv file
}
您可以在这里找到更多的文档:如果它工作正常并且性能相对较好,那么老实说,我会称之为“暂时不错”,然后继续下一个任务。如果它真的成为瓶颈,你可以研究重构。10Mb听起来不像是会导致内存不足错误的数据量。是的,我现在的任务是改进这个过程。这并不重要,但如果我们能够找到对CSV文件进行排序的方法,我们希望去掉临时表(数据库)@apokryfos是的10mb不是什么大问题,但这并不是cron需要消耗资源的唯一原因如果它工作正常且性能相对较好,那么老实说,我会称之为“目前良好”,并继续下一个任务。如果它真的成为瓶颈,你可以研究重构。10Mb听起来不像是会导致内存不足错误的数据量。是的,我现在的任务是改进这个过程。这并不重要,但如果我们能够找到对CSV文件进行排序的方法,我们希望去掉临时表(数据库)@apokryfos是的,10mb不是什么大问题,但这并不是cron需要消耗资源的唯一原因