[英]Optimization db queries - scaling big data - Laravel 5
我一直在研究使用Laravel 5的Web应用程序。它在Windows 8.1 PC的localhost(xampp)上运行。 4GB RAM,2,67GHz处理器,非常简单。
我经常查询的表包含很多行(10.000给予或接受)-如此之多,以至于编写了一个执行以下操作的路由:
return User::all();
运行此命令仅会返回白屏。 有时Chrome控制台会列出500(内部服务器错误)。
显示在查询之前进行的回显或打印,但执行之后不显示任何内容。 查询另一个模型(其表只有2行)可以正确返回数据。
这使我得出结论,我的服务器无法很好地扩展此数据量。 我正在尝试通过修复此问题。
User::all()->chunk(200, function($chunkOfTickets){ /*some code*/});
我希望它将数据分成多个块,以使其在服务器上更容易。 但是,这是行不通的,因为Eloquent首先获取所有数据(由于无法处理而中断了数据),然后才将其划分为大块。
谢谢阅读。
编辑:反复测试,要求越来越多的数据量。 限制大约是26000行(返回27000,并且返回内存不足错误)。
如评论中所述,php日志指出了这一点。 显然我在Laravel可能显示错误消息之前请求了太多的内存,使其崩溃了
[01-Jul-2015 17:27:51 UTC] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8376445 bytes) in C:\xampp\htdocs\gamescaffold\vendor\laravel\framework\src\Illuminate\Support\Collection.php on line 791
额外编辑
有没有一种方法可以将来自数据库的答复分成几部分? 喜欢:
User::chunk(200)->all(); /*which obviously does not work*/
如果我直接通过phpMyAdmin向数据库中写入一个看似复杂的查询,它将在0.0045秒内返回37035行。 (我怀疑这里有一些xampp进行的后台优化)
DB::table("table")
->select('column1', 'column2')
->orderBy('column2', 'asc')
->chunk(70000, function($users) {
foreach ($users as $row) {
// To do with data
}
}
注意 :我将其发布为答案,因为它涉及一些代码。 我想我完全错过了您在原始问题中的观点,因为尽管您试图将整个结果集返回给客户。 如果仍然缺少任何内容,请发表评论,然后删除此答案。
因此,我想获取一组对象,对其进行处理,然后将其保存回数据库
这很简单!
$chunkSize = 100; // or whatever your memory allows
$totalUsers = User::count();
$chunks = floor($totalUsers / $chunkSize);
for ($chunk = 0; $chunk <= $chunks; $chunk++) {
$offset = $chunk * $chunkSize;
$users = User::skip($offset)->take($chunkSize)->get();
foreach($users as $user)
{
// do something
$user->save();
}
}
如果花费的时间太长,则从HTTP触发此循环可能会导致超时,因此您应该从控制台运行它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.