我已经使用此程序包一年多了。 最近,我开始在内存和性能方面遇到问题。 用户正在尝试下载大量数据; 有时历史数据。 因此,我阅读了文档,然后找到了排队的部分。 起初,这是一个完美的解决方案。 对于排队的导出,将分派多个作业,以按块生成文件。 但是我注意到了一些。 分派的每个作业(AppendQueryToSheet)花费的时间都比上一个多。 最终工作(CloseSheet)花费了更多时间才能完成。
我的问题是:这是排队导出的工作方式吗? 或我想念什么吗?
我正在使用Redis和Horizon。 即使我尝试了多名工人,但似乎每当工作完成时,都会派出新工作。 因此,它没有解决我的问题。
我附上了这张图片,所以您可以看到已注册的时间。
每个查询都必须重新打开电子表格文件,这需要花费一定时间PhpSpreadsheet,因此,每次追加的确需要更长的时间。
我计划对3.2进行一些更改,以改善这一点。
我在这里遇到同样的问题。 文件大小也不大,只有5-10mb。 我没有遇到CPU或内存使用率的任何峰值。
我决定使用python和pandas构建服务,它改进了很多,我的意思是说很多。 Laravel Excel是一个出色的库,但我想这可能不是正确的工具
@ okmkey45公平地说,这并不是Laravel Excel的真正错,它依赖于PHPSpreadsheet,PHPSpreadsheet是一个用于读取/写入文件的低效库。 很遗憾,因为关于分块查询和排队作业的抽象在这里非常方便,并且为我节省了很多时间在Go / Python中编写服务并将其与我的队列挂钩。
PHPSpreadsheet有很多替代方法,它们在大型文件上的运行速度要快得多,也许当我们使用->queue
或ShouldQueue
时可以将它们交换掉吗?
@aakarim实际上是我考虑过的东西,但是目前没有时间或用例来实现。 我将对PR保持开放,只要它保持简单并选择加入即可。
在这个截止日期之后,我将受到打击。 是否有您喜欢/推荐@patrickbrouwers的软件包? https://github.com/box/spout似乎是一个不错的起点。
@aakarim是的盒子/壶嘴。 我什至考虑过,如果您只想使用csv,就可以使用League / csv,这是迄今为止大批量进出口的最快选择。
最有用的评论
每个查询都必须重新打开电子表格文件,这需要花费一定时间PhpSpreadsheet,因此,每次追加的确需要更长的时间。
我计划对3.2进行一些更改,以改善这一点。