如何通过读取CSV文件来保留大量数据

时间:2014-12-01 04:48:00

标签: ruby-on-rails parsing csv

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

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

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

3 个答案:

答案 0 :(得分:4)

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

可能对于文件夹具来说,使用分割

等工具会更快
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>')

答案 1 :(得分:2)

由于您希望将数据保存到MySQL进行进一步处理,因此使用MySQL的Load Data Infile会更快。您的架构如下所示:

sql =&#34; LOAD DATA LOCAL INFILE&#39; big_data.csv&#39;  INTO TABLE测试  FIELDS终止于&#39;,&#39;包含在&#39; \&#34;&#39;  线路终止于&#39; \ n&#39;  (FOO,foo1)&#34;

con = ActiveRecord :: Base.connection

con.execute(SQL)

答案 2 :(得分:1)

关键点:

  1. 如果您使用MySQL InnoDB引擎,我的建议是始终定义自动增量PRIMARY KEY ,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. 您应该使用生产者 - 消费者方案。
  4. 抱歉我的英语不好。