Laravel 插入数据 运行 内存不足
Laravel insert data run out of memory
使用 Laravel 4.2,我正在使用 Artisan 命令从固定长度的文本文件中读取数据并插入到我们的数据库中。我需要使用非默认连接将这些数据插入到我们的数据库中。当我这样做时,我 运行 在解析数据时内存不足。 'Allowed memory size of 1073741824 bytes exhausted'。 为什么我使用非默认数据库连接 运行 内存不足,但是当我使用 'default' 数据库时
连接有效吗?
如果我使用 'default' 连接,我可以无错误地加载数据。工作完美,除了数据在错误的数据库中。
如果我使用 'static' 连接(不是默认的连接),我每次都会 运行 内存不足。
认为我尝试过但没有成功:
我正在禁用查询日志记录。
\DB::disableQueryLog();
更改数据库默认连接。
\Config::set('database.default', \Config::get('database.static'));
将模型用作 Eloquent 带有数据库插入的模型
$model = new \vendor\VendorCat();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert($model->toArray());
使用模型作为标准类
$model = new \stdClass();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert(json_decode(json_encode($model), TRUE));
数据库配置:
return array(
'log' => FALSE,
'fetch' => PDO::FETCH_CLASS,
'default' => 'mysql',
'static' => 'defaultstatic',
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTION',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
'defaultstatic' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTIONSTATIC',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
'migrations' => 'migrations',
'redis' => array(
'cluster' => FALSE,
'default' => array(
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
),
),
);
用于处理数据的代码:
\DB::disableQueryLog();
$list = scandir($path, SCANDIR_SORT_ASCENDING);
foreach($list as &$file) {
$fullpath = $path . '/' . $file;
$pi = pathinfo($fullpath);
if ( strcasecmp('dat', $pi['extension']) != 0 ) {
continue;
}
$cnt++;
$this->processFile($fullpath);
$fullpath = null;
unset($fullpath);
$pi = null;
unset($pi);
}
$list = null;
unset($list);
while ( ! feof($hdl) ) {
$line = fread($hdl, $len); // fixed length text 1503 bytes
if ($line === FALSE) break;
if (strlen($line) == 0) break;
$model = new \vendor\VendorCat();
//$model = new stdClass();
/** set model properties, 86 properties, example... */
$model->engprop = trim(substr($line, 1174, 1));
$model->engho = trim(substr($line, 1176, 1));
$model->save();
// $model->setConnection(\Config::get('database.static'))->save();
// $model = new \vendor\VendorCat();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert($model->toArray());
// $model = new \stdClass();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert(json_decode(json_encode($model), TRUE));
$line = null;
unset($line);
$model = null;
unset($model);
}
我还没有读完整题。但是错误信息可以通过way:change memory_limit in php.ini 配置文件来解决。之后它可能会起作用。
DB::disableQueryLog() 仅适用于默认连接。所以你必须为每个连接禁用它(以防止内存泄漏)。
使用 Laravel 4.2,我正在使用 Artisan 命令从固定长度的文本文件中读取数据并插入到我们的数据库中。我需要使用非默认连接将这些数据插入到我们的数据库中。当我这样做时,我 运行 在解析数据时内存不足。 'Allowed memory size of 1073741824 bytes exhausted'。 为什么我使用非默认数据库连接 运行 内存不足,但是当我使用 'default' 数据库时 连接有效吗?
如果我使用 'default' 连接,我可以无错误地加载数据。工作完美,除了数据在错误的数据库中。
如果我使用 'static' 连接(不是默认的连接),我每次都会 运行 内存不足。
认为我尝试过但没有成功:
我正在禁用查询日志记录。
\DB::disableQueryLog();
更改数据库默认连接。
\Config::set('database.default', \Config::get('database.static'));
将模型用作 Eloquent 带有数据库插入的模型
$model = new \vendor\VendorCat();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert($model->toArray());
使用模型作为标准类
$model = new \stdClass();
\DB::connection(\Config::get('database.static'))
->table('vendorcat')
->insert(json_decode(json_encode($model), TRUE));
数据库配置:
return array(
'log' => FALSE,
'fetch' => PDO::FETCH_CLASS,
'default' => 'mysql',
'static' => 'defaultstatic',
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTION',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
'defaultstatic' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'PRODUCTIONSTATIC',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
'migrations' => 'migrations',
'redis' => array(
'cluster' => FALSE,
'default' => array(
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
),
),
);
用于处理数据的代码:
\DB::disableQueryLog();
$list = scandir($path, SCANDIR_SORT_ASCENDING);
foreach($list as &$file) {
$fullpath = $path . '/' . $file;
$pi = pathinfo($fullpath);
if ( strcasecmp('dat', $pi['extension']) != 0 ) {
continue;
}
$cnt++;
$this->processFile($fullpath);
$fullpath = null;
unset($fullpath);
$pi = null;
unset($pi);
}
$list = null;
unset($list);
while ( ! feof($hdl) ) {
$line = fread($hdl, $len); // fixed length text 1503 bytes
if ($line === FALSE) break;
if (strlen($line) == 0) break;
$model = new \vendor\VendorCat();
//$model = new stdClass();
/** set model properties, 86 properties, example... */
$model->engprop = trim(substr($line, 1174, 1));
$model->engho = trim(substr($line, 1176, 1));
$model->save();
// $model->setConnection(\Config::get('database.static'))->save();
// $model = new \vendor\VendorCat();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert($model->toArray());
// $model = new \stdClass();
// \DB::connection(\Config::get('database.static'))
// ->table('vendorcat')
// ->insert(json_decode(json_encode($model), TRUE));
$line = null;
unset($line);
$model = null;
unset($model);
}
我还没有读完整题。但是错误信息可以通过way:change memory_limit in php.ini 配置文件来解决。之后它可能会起作用。
DB::disableQueryLog() 仅适用于默认连接。所以你必须为每个连接禁用它(以防止内存泄漏)。