【问题标题】:python - slow saving big files into the databasepython - 将大文件保存到数据库中很慢
【发布时间】:2018-03-10 10:36:32
【问题描述】:

我必须从 XML 文件中解析数据,每个文件有超过 170k 行。结构如下:

<el1>
    <el2>
        <el3>
            <el3-1>...</el3-1>
            <el3-2>...</el3-2>
        </el3>
        <el4>
            <el4-1>...</el4-1>
            <el4-2>...</el4-2>
        </el4>
        <el5>
            <el5-1>...</el4-1>
            <el5-2>...</el5-2>
        </el5>
    </el2>
</el1>

基本上我需要保存“el”标签中的属性,每个标签代表数据库中的一个表。所以我从 el1 中的属性中获取值并将它们插入到表等中。问题是,有很多标签 el3、el4、el5 ......我想当我在每个标签之后调用 INSERT 时,它减慢整个过程,因为 1 个文件需要大约 3 分钟才能保存到数据库中。

我想我可以通过将值保存到列表中来解决这个问题,当处理文件时,我运行 1 INSERT 命令来保存所有值。但问题是在我执行INSERT命令之前,我从上一个元素中选择了最后插入的id,并将其作为他的外键放入下一个元素的INSERT命令中。如果我想将值保存到列表中,我无法从数据库中获取最后一个 id,因为插入将发生在文件末尾。

不知道是不是因为INSERT命令太多导致整个过程变慢了,这只是我的猜测。

【问题讨论】:

  • "slow" 是相对的,你没有5个太多的信息。对于这样的数据,我认为第一种方法应该还是最好的:保持简单。但是你如何读取xml(以及你使用了哪个模块),你如何插入行,你如何配置postgresql等等。这样的问题影响很大。

标签: python xml postgresql


【解决方案1】:

如果您还没有这样做,请在单个事务中运行所有 INSERT 语句,这会产生很大的不同。

为了获得更好的答案,请提供更多数据,例如您的代码、您的系统以及您每秒达到的交易数量。

【讨论】:

  • 你是对的,我在每个 INSERT 语句之后都有 commit() 函数。我认为如果在 INSERT 之后没有 commit(),它不会保存数据,因为我没有看到任何更改在数据库中,但实际上如果 commit() 只是在脚本的末尾,则在处理文件后立即保存数据。谢谢
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 2012-05-19
  • 2021-06-05
  • 2017-10-25
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多