关于使用 Lazy Collections 来提高 Laravel Excel 读取的性能详解(轻松支持百万数据)
发布时间 - 2020-03-21 00:00:00 点击率:次在 laravel 6 中添加了一种新类型的集合: lazy collections。 如果需要处理非常大的数据集(数千或数百万行)而不会遇到内存限制,那么它们是非常棒的。
推荐:laravel教程
我最近的任务是在工作中的一个项目中重构 Excel 导出。 问题是,由于数据集太大,Laravel 无法处理,导出无法再创建。 数据库查询返回了大约 300,000 个结果! 应用程序产生超时或一直内存不足。
一种天真的方法是增加超时时间或内存限制,并希望下次出现问题时,另一个人会处理这个问题。 但这不是我的工作方式。 我不喜欢创可贴。 我喜欢具体的、长期的解决方案。
Laravel Excel 扩展包已经相当灵活。 通过在使用 FromQuery-concerns 时使用「chunks」,它在减少数据库负载方面做得很好。 然而,我们的导出仍然很难处理大数据集。
我和我的同事讨论过,我们是否应该完全重写这个特性:将导出推送到队列中,并在导出结束时向用户发送通知。 然而,这个功能在这个应用程序中只是一个很小的东西。 对我们来说,仅仅为了一个简单的导出而增加如此多的开销是没有意义的。
那天晚些时候,我有一个小小的「我发现了」的时刻,因为我记得 Laravel 中有 LazyCollections 这个东东。
我重新编写了导出:它现在使用 FromCollection-concern,而不是 FromQuery。 我必须对 collection() 方法进行的惟一更改是将查询构建器链末尾的 get() 方法替换为 cursor()。
下面是我们导出功能的简化版本。 Request 对象通过构造函数传递,因此我们可以根据用户在 UI 中选择的内容对查询进行调整。
request = $request;} public function collection() { return User::query() ->when($this->request->get('include_subscribed'), function ($q) { return $q->where('is_subscribed', true); }) ->cursor(); // ← 重要的一点 } }
我相信你在你的项目中遇到了内存问题。 你增加了内存限制,希望问题已经解决了 (我自己已经做过无数次了)。
如果是在 Laravel 项目中,我希望,我可以让你重新查看该代码并使用 LazyCollections 重写。
修复这个问题非常有趣,所以我做了一个小小的基准测试:我们的导出现在可以轻松地导出数百万行,而不会遇到内存限制。 太酷了!
# laravel
# 构造函数
# Collection
# 对象
# 数据库
# ui
# 重构
# excel
# 这个问题
# 重写
# 一个小小
# 数百万
# 应用程序
# 是在
# 很好
# 让你
# 在这个
# 很难
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何确认建站备案号应放置的具体位置?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Python自动化办公教程_ExcelWordPDF批量处理案例
音响网站制作视频教程,隆霸音响官方网站?
详解vue.js组件化开发实践
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Laravel怎么连接多个数据库_Laravel多数据库连接配置
如何彻底卸载建站之星软件?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
免费视频制作网站,更新又快又好的免费电影网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何在宝塔面板中创建新站点?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel如何实现模型的全局作用域?(Global Scope示例)
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
如何在搬瓦工VPS快速搭建网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
公司网站制作价格怎么算,公司办个官网需要多少钱?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
如何在橙子建站上传落地页?操作指南详解
IOS倒计时设置UIButton标题title的抖动问题
如何在万网自助建站平台快速创建网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
使用Dockerfile构建java web环境
javascript中对象的定义、使用以及对象和原型链操作小结
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
创业网站制作流程,创业网站可靠吗?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
JavaScript如何实现音频处理_Web Audio API如何工作?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel观察者模式如何使用_Laravel Model Observer配置
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Python制作简易注册登录系统
如何快速生成专业多端适配建站电话?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何快速搭建高效WAP手机网站吸引移动用户?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
怎么用AI帮你设计一套个性化的手机App图标?
googleplay官方入口在哪里_Google Play官方商店快速入口指南


}
public function collection()
{
return User::query()
->when($this->request->get('include_subscribed'), function ($q) {
return $q->where('is_subscribed', true);
})
->cursor(); // ← 重要的一点
}
}