【发布时间】:2020-12-01 21:54:04
【问题描述】:
我正在创建一个 CSV 导入器,它将 CSV 文件加载到 MariaDB 10.3.23 数据库中。为此,我在带有 PHP 7.4 环境的 Laravel 7 中使用以下代码:
$query = <<<eof
LOAD DATA LOCAL INFILE '$this->filePath'
INTO TABLE `$tableName`
$characterSet
FIELDS TERMINATED BY '$this->delimiter'
ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
eof;
DB::connection()->getpdo()->exec($query);
我正在使用 ploi.io 来部署和监控我的网站,它在监控页面上显示以下屏幕:
当我重新启动 MariaDB 服务时,RAM-display-line 为 15%,但每当我开始新的导入(因此是新的 LOAD DATA INFILE)时,使用的 RAM 量就会增加(这不是奇怪),并保持不变。 RAM 行的高度差异是由于 CSV 文件大小的差异造成的。看起来它完成了数据加载,并且没有清空之后用于它的内存。
关于如何解决这个问题的任何想法?
ps。我不擅长 infra/devops,所以如果你们需要更多信息,请告诉我。
【问题讨论】:
-
这是否会导致问题,例如当您要导入下一个文件时,mysql会耗尽内存?因为如果这不是问题,那么我不会花太多时间来解决它。
-
操作可能被缓存了。当需要其他事情时,内存可能会被清除。垃圾收集是一个非常昂贵的过程,除非真的有必要,否则软件通常会推迟这样做。
-
jep,最终会导致超出内存限制的错误,会导致mysql崩溃。每次我做新的导入(可能超过 100 个),RAM 都会堆积起来,直到手动重启 mysql 崩溃时才会被清除。
-
有没有办法不缓存 LOAD DATA INFILE?在我看来,这是每个文件的一次性操作(“将所有记录放入数据库”)。
标签: mysql laravel memory-management mariadb load-data-infile