2009-09-10 77 views
0

我必须创建大约100k条记录。 这些记录位于csv文件中,正在使用create_fixtures函数加载。 它在我的开发机器上很慢,但它完成了。问题始于生产,每个进程都有内存限制,导致耙机进程被终止。 我认为这是因为create_fixtures正在将所有数据导入到内存中。有没有人知道如何强制它导入较小的块(在我将一个大的csv切成几个较小的块之前)。Ruby on rails:create_fixtures内存问题

回答

0

你是如何加载/解析CSV的?我想我会使用Ruby的文件工具打开并阅读和解析每一行我自己。

1

不要这样做!

create_fixtures是专为加载测试数据而设计的,测试数据应该只有在需要锻炼功能的时候才会大。它是而不是,用于将数千条记录加载到生产(或任何其他类型)的数据库中。如果这是一次性的,那么也许可以,但作为一个常规的事情,它会让我非常紧张。

如果你的数据是很简单的,我指的是一个简单的String#split会的工作,那么这也许应该是你的方法,像

File.foreach(csv_file_path) do |line| 
    fields = line.split(/,/) 
    # create records from the array of fields 
end 

否则(即你可能有引号或逗号的字符串值,缺少字段值或多种记录格式等),您应该查看已安装Ruby 1.8.6的CSV library,或者更好的方法是查看FasterCSV Gem,它在1.9以后取代了CSV。

UPDATE:相当方便,瑞安贝茨只是种子数据的无理取闹话题posted a screencast ...

+0

虽然我明白,这是不好的做法,加载在生产固定装置(例如无验证),对于一些数据(如国家/城市/等...)这是必要的。我在这里找到了很好的讨论:http://railspikes.com/2008/2/1/loading-seed-data (看起来不是夹具内存问题,而是人们如何处理播种生产。) – 2009-09-10 11:35:00

+0

也许我正在读不同的部分。我看到这个“我不喜欢夹具,因为他们不验证数据”。该帖子的评论提到了ar-extensions,如果数据库批量写入速度是一个问题,这是非常有用的。我并不需要种子数据(这是你要做的所有事情 - 这个问题并不清楚),我只是觉得如果你放弃尝试使用夹具加载某些东西它不是为了设计。 – 2009-09-10 19:05:48