【问题标题】:How to persist large amounts of data by reading from a CSV file如何通过读取 CSV 文件来保存大量数据
【发布时间】:2015-01-29 01:44:18
【问题描述】:

如何通过读取 CSV 文件(比如 2000 万行)来保存大量数据。 到目前为止,它已经运行了将近 1 1/2 天,并且只保留了 1000 万行,我怎样才能批处理它以使其变得更快,并且有可能以并行方式运行它。

我正在使用此处的代码来读取 CSV,我想知道是否有更好的方法来实现这一点。

参考:dealing with large CSV files (20G) in ruby

【问题讨论】:

  • 内存中有 2000 万行的目标是什么?为什么不直接读取每一行并将其放入 SQLite 数据库中呢? (然后在那里进行分析)如果您尝试处理大量数据,那么您会想看看 MapReduce。
  • 我想处理所有数据并将其存储在 MySQL 数据库中以供进一步处理。让我知道我是否可以优化读取数据或批量持久化数据的方式。在这里欣赏任何代码 sn-ps。行也通过了吗?
  • 您能提供一个示例架构吗?那我会整理一个sn-p。
  • create_table :test do |t| t.integer :foo, :null => false, :limit => 11 t.integer :foo1, :null => false, :limit => 11 t.integer :foo2, :null => false, :limit => 11结束结束
  • @Besto 可以提供sn-p的代码吗?

标签: ruby-on-rails parsing csv


【解决方案1】:

关键点:

  1. 如果您使用 MySQL InnoDB 引擎,我的建议是始终定义一个自增主键,InnoDB 使用聚集索引来存储表中的数据。聚集索引确定表中数据的物理顺序。
    参考:http://www.ovaistariq.net/521/understanding-innodb-clustered-indexes/
  2. 配置您的 MySQL 服务器参数,最重要的是
    (1) 关闭mysql binlog
    (2) innodb_buffer_pool_size。
    (3) innodb_flush_log_at_trx_commit
    (4) bulk_insert_buffer_size
    您可以阅读:http://www.percona.com/blog/2013/09/20/innodb-performance-optimization-basics-updated/
  3. 您应该使用生产者-消费者场景。

对不起,我的英语不好。

【讨论】:

    【解决方案2】:

    由于您希望将数据保存到 MySQL 以供进一步处理,因此使用从 MySQL 加载数据文件会更快。您的架构类似于以下内容:

    sql = "加载数据本地 INFILE 'big_data.csv' INTO TABLE 测试 由 ',' 终止的字段由 '\"' 包围 以“\n”结尾的行 (foo,foo1)"

    con = ActiveRecord::Base.connection

    con.execute(sql)

    【讨论】:

    【解决方案3】:

    您可以尝试先将文件拆分成几个较小的文件,然后才能并行处理多个文件。

    可能为了分割文件,使用 split 之类的工具会更快

    split -l 1000000 ./test.txt ./out-files-
    

    然后,当您处理每个文件并假设您正在插入记录而不是逐个插入它们时,您可以将它们组合成批次并进行批量插入。比如:

    INSERT INTO some_table 
    VALUES 
    (1,'data1'), 
    (2, 'data2')
    

    为了获得更好的性能,您需要自己构建 SQL 语句并执行它:

    ActiveRecord::Base.connection.execute('INSERT INTO <whatever you have built>')
    

    【讨论】:

    • 另外,请确保在 ActiveRecord::Base.transaction { } 块内运行所有插入。
    猜你喜欢
    • 2017-12-09
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多