gpt4 book ai didi

php - 使用 php 在 mysql 中插入一百万行时如何防止内存不足

转载 作者:可可西里 更新时间:2023-11-01 07:30:18 25 4
gpt4 key购买 nike

我在 Laravel 中构建了一个脚本,它逐行读取 JSON 文件并将内容导入我的数据库。

但是,在运行脚本时,我在插入大约 80K 条记录后出现内存不足错误。

mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory
PHP Fatal error: Out of memory (allocated 421527552) (tried to allocate 12288 bytes) in /home/vagrant/Code/sandbox/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php on line 1758

mmap() failed: [12] Cannot allocate memory
PHP Fatal error: Out of memory (allocated 421527552) (tried to allocate 32768 bytes) in /home/vagrant/Code/sandbox/vendor/symfony/debug/Exception/FatalErrorException.php on line 1

我建立了一种临时队列,每 100 次才提交收集的项目,但这没有任何区别。

这是我执行插入的代码部分的样子:

public function callback($json) {

if($json) {

$this->queue[] = [

'type' => serialize($json['type']),
'properties' => serialize($json['properties']),
'geometry' => serialize($json['geometry'])
];

if ( count($this->queue) == $this->queueLength ) {

DB::table('features')->insert( $this->queue );

$this->queue = [];
}
}
}

这是导致错误的实际插入 (DB::table('features')->insert( $this->queue );),如果我将它们排除在外,我可以完美遍历所有行并在没有任何性能问题的情况下回显它们。

我想我可以分配更多内存,但我怀疑这是否是一个解决方案,因为我正在尝试插入 300 万条记录,但在分配了 512Mb 内存的 80K 之后,它目前已经失败了。此外,我实际上想在低预算服务器上运行此脚本。

运行此脚本所需的时间无关紧要,因此如果我能以某种方式减慢记录的插入速度,那将是我可以接受的解决方案。

最佳答案

如果您使用 MySQL 5.7+,它具有使用 LOAD DATA INFILE 从 JSON 文件导入数据的功能。

LOAD DATA INFILE 'afile.json' INTO TABLE atable (field1, field2, ....);

如果您使用较低版本的 MySQL,则需要先将 JSON 转换为 CSV 格式。例如使用 https://github.com/danmandle/JSON2CSV

LOAD DATA INFILE 'afile.csv' INTO TABLE atable (field1, field2, ....);

参见 LOAD DATA INFILEdocumentation .

关于php - 使用 php 在 mysql 中插入一百万行时如何防止内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com