将大型json文件保存到mysql时性能更好

t2a7ltrp  于 2021-06-20  发布在  Mysql
关注(0)|答案(0)|浏览(239)

我有个问题。
所以,我的故事是:
我有一个30gb的大文件(json),包含特定时间段内所有reddit帖子。我不会将每个post的所有值都插入表中。
我关注了这个系列,他用python编写了我要做的事情。我试着跟随(在nodejs中),但是当我测试它时,它太慢了。它每5秒插入一行。有500000多个reddit帖子,这实际上需要几年的时间。
这里有一个我在做的例子。

var readStream = fs.createReadStream(location)
oboe(readStream)
    .done(async function(post) {
        let { parent_id, body, created_utc, score, subreddit } = data;
        let comment_id = data.name;

        // Checks if there is a comment with the comment id of this post's parent id in the table
        getParent(parent_id, function(parent_data) {
            // Checks if there is a comment with the same parent id, and then checks which one has higher score
            getExistingCommentScore(parent_id, function(existingScore) {

                // other code above but it isn't relevant for my question

                // this function adds the query I made to a table
                addToTransaction()

            })
        })
})

基本上,这就是启动一个读取流,然后把它传递给一个叫做双簧管的模块。
然后我得到json作为回报。然后,它检查数据库中是否已经保存了父级,然后检查是否存在具有相同父级id的现有注解。
我需要同时使用这两个函数来获取所需的数据(仅获取“最佳”注解)
这是怎么回事 addToTransaction 看起来像:

function addToTransaction(query) {
    // adds the query to a table, then checks if the length of that table is 1000 or more

    if (length >= 1000) {
        connection.beginTransaction(function(err) {
            if (err) throw new Error(err);

            for (var n=0; n<transactions.length;n++) {
                let thisQuery = transactions[n];
                connection.query(thisQuery, function(err) {
                    if (err) throw new Error(err);
                })
            }

            connection.commit();
        })
    }
}

什么 addToTransaction 是获取我所做的查询并将它们推送到一个表中,然后检查该表的长度,然后创建一个新事务,在for循环中执行所有这些查询,然后comitting(保存)。
问题是,它太慢了,以至于我所做的回调函数都没有被调用。
我的问题(最后)是,有什么方法可以提高性能?
(如果你想知道我为什么这么做,那是因为我正在尝试创建一个聊天机器人)
我知道我发了很多帖子,但我尽量给你提供更多的信息,以便你有更好的机会帮助我。谢谢你的回答,我会回答你的问题。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题