我如何使用 Laravel 的块来避免 运行 内存不足?
How do I use Laravel's chunk to avoid running out of memory?
我正在从临时 table 中提取大约 10 万条记录,对数据进行一些轻微修改,下载照片,然后将我需要保留的字段放入 "master" table.这很快导致我的应用程序崩溃,因为它 运行 内存不足。
我阅读了有关将 chunk() 与 Laravel 的 eloquent ORM 一起使用的非常简短的文档,但不知道如何在我的 class 中开始实施它。
这是我目前正在做的事情:
public function fire()
{
// Turn off query logging
DB::connection()->disableQueryLog();
$feeds = RetsFeed::where('active','=',1)->get();
foreach ($feeds as $feed)
{
$class = "TempListing{$feed->board}";
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
$listings->each(function($listing) use ($feed) {
ListingMigrator::migrateListing($listing,$feed);
echo "Feed: $feed->board\r\n";
echo "SubcondoName: $listing->SubCondoName\r\n";
echo "Development: $listing->Development\r\n";
echo "\r\n";
});
}
}
每个提要(或数据源)都被转储到不同杂务中的临时 table。那很好用。然后,我从一个 table(平均大约 30k)和 运行 我的 ListingMigrator 方法中获取所有 hte 列表。
在这个例子中我把块放在哪里?它会取代行:
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
我不完全理解 eloquent 文档中的闭包。这就是他们要说的全部内容,这是来自 Laravel 站点的代码示例:
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
chunk
调用应替换 get
调用 - 它旨在处理 pre-get() 查询构建器对象。
$listings = $class::orderBy('MatrixModifiedDT','desc');
$listings->chunk(200, function($listings) use($feed) {
$listings->each(function($listing) use ($feed) {
ListingMigrator::migrateListing($listing,$feed);
echo "Feed: $feed->board\r\n";
echo "SubcondoName: $listing->SubCondoName\r\n";
echo "Development: $listing->Development\r\n";
echo "\r\n";
});
});
我正在从临时 table 中提取大约 10 万条记录,对数据进行一些轻微修改,下载照片,然后将我需要保留的字段放入 "master" table.这很快导致我的应用程序崩溃,因为它 运行 内存不足。
我阅读了有关将 chunk() 与 Laravel 的 eloquent ORM 一起使用的非常简短的文档,但不知道如何在我的 class 中开始实施它。
这是我目前正在做的事情:
public function fire()
{
// Turn off query logging
DB::connection()->disableQueryLog();
$feeds = RetsFeed::where('active','=',1)->get();
foreach ($feeds as $feed)
{
$class = "TempListing{$feed->board}";
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
$listings->each(function($listing) use ($feed) {
ListingMigrator::migrateListing($listing,$feed);
echo "Feed: $feed->board\r\n";
echo "SubcondoName: $listing->SubCondoName\r\n";
echo "Development: $listing->Development\r\n";
echo "\r\n";
});
}
}
每个提要(或数据源)都被转储到不同杂务中的临时 table。那很好用。然后,我从一个 table(平均大约 30k)和 运行 我的 ListingMigrator 方法中获取所有 hte 列表。
在这个例子中我把块放在哪里?它会取代行:
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
我不完全理解 eloquent 文档中的闭包。这就是他们要说的全部内容,这是来自 Laravel 站点的代码示例:
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
chunk
调用应替换 get
调用 - 它旨在处理 pre-get() 查询构建器对象。
$listings = $class::orderBy('MatrixModifiedDT','desc');
$listings->chunk(200, function($listings) use($feed) {
$listings->each(function($listing) use ($feed) {
ListingMigrator::migrateListing($listing,$feed);
echo "Feed: $feed->board\r\n";
echo "SubcondoName: $listing->SubCondoName\r\n";
echo "Development: $listing->Development\r\n";
echo "\r\n";
});
});