gpt4 book ai didi

javascript - 使用 node.js 将多行插入到 mysql

转载 作者:行者123 更新时间:2023-11-30 23:46:44 26 4
gpt4 key购买 nike

我正在尝试将一个大文件导入数据库。在多次尝试通过 mySQL 导入 csv 文件失败后,我决定创建一个可以读取文件并一条一条插入记录的小型 Node 脚本。

我有大约 10 个不同格式的文件,每个文件大小为 80mb。当前脚本针对的是一个文件,每一行都有一个 id,仅此而已(这个特定的表只包含一个 id 字段和一个 status 字段),这是它的当前状态:

var mysql      = require('mysql');
var connection = mysql.createConnection({
host : 'hostname',
user : 'username',
password : 'password',
database : 'database'
});

var rl = require('readline').createInterface({
input: require('fs').createReadStream('fileToRead.txt')
});

connection.connect();
rl.on('line', function (line) {
var query = 'REPLACE INTO database.tablename(field1,field2) VALUES ("'+line+'",0);';
connection.query(query, function(err) {
if (err) {
console.log("ERR:"+err);
connection.end();
}
});
});

大约十到十二行它工作正常,然后抛出以下错误:

   <--- Last few GCs --->

51338 ms: Scavenge 699.0 (738.6) -> 699.0 (738.6) MB, 8.7 / 0 ms (+ 15.0 ms i
n 1 steps since last GC) [allocation failure] [incremental marking delaying mark
-sweep].
53709 ms: Mark-sweep 699.0 (738.6) -> 698.9 (738.6) MB, 2360.5 / 0 ms (+ 15.0
ms in 2 steps since start of marking, biggest step 15.0 ms) [last resort gc].
56065 ms: Mark-sweep 698.9 (738.6) -> 698.9 (738.6) MB, 2360.2 / 0 ms [last r
esort gc].



<--- JS stacktrace --->
==== JS stack trace =========================================

Security context: 1DF25599 <JS Object>
1: emit [events.js:~117] [pc=23C30364] (this=1027D245 <a Protocol with map 3
2339A39>,type=1DF4D5B1 <String[7]: enqueue>)
2: arguments adaptor frame: 2->1
3: _enqueue [path\node_modules\mysql\lib\protocol\
Protocol.js:~128] [pc=107BD3D8] (this=1027D245 <a Protocol with map 32339A39>,se
quence=157A3225 <a Query with map 3233C379>)
4: /* anonymous */ [path...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

我不习惯 Node ,所以我真的不知道那是什么意思。我相信这与从移动速度比查询更快的循环内部调用的查询有关,但我不确定,如果是这种情况,我也不知道如何处理。

感谢任何帮助。

抱歉,如果我的英语不好。

最佳答案

问题是您要在第一个查询结束后结束与数据库的连接,因此,应该只执行有足够时间访问数据库的查询数量,我的猜测是只有第一个会被插入(也许我在这里错了)。

由于您可能正在执行 Node 的“一次性脚本”,您可以通过删除该行来解决问题,如下所示:

var mysql      = require('mysql');
var connection = mysql.createConnection({
host : 'hostname',
user : 'username',
password : 'password',
database : 'database'
});

var rl = require('readline').createInterface({
input: require('fs').createReadStream('fileToRead.txt')
});

connection.connect();
rl.on('line', function (line) {
var query = 'REPLACE INTO database.tablename(field1,field2) VALUES ("'+line+'",0);';
connection.query(query, function(err) {
if (err) {
console.log("ERR:"+err);
//I am not closing the connection anymore
}
});
});

如果您的脚本可以多次使用(每月一次、每天一次或类似情况),我会建议一个更好的解决方案,可能使用async 和连接池。

关于javascript - 使用 node.js 将多行插入到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512933/

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