Ruby on rails 使用ruby并行处理CSV文件

Ruby on rails 使用ruby并行处理CSV文件,ruby-on-rails,ruby,csv,parallel-processing,Ruby On Rails,Ruby,Csv,Parallel Processing,我有一个非常大的CSV文件,大约800000行。我想尝试并行处理此文件,以加快脚本速度 如何使用Ruby将一个文件拆分为n个较小的部分?我将使用linux split命令将该文件拆分为许多较小的文件。然后,我将处理这些较小的部分。我将使用linux split命令将此文件拆分为许多较小的文件。然后,您将处理这些较小的部分。对于csv文件,您可以执行以下操作: open("your_file.csv").each_line do |line| # do your stuff here like

我有一个非常大的CSV文件,大约800000行。我想尝试并行处理此文件,以加快脚本速度


如何使用Ruby将一个文件拆分为n个较小的部分?

我将使用linux split命令将该文件拆分为许多较小的文件。然后,我将处理这些较小的部分。

我将使用linux split命令将此文件拆分为许多较小的文件。然后,您将处理这些较小的部分。

对于csv文件,您可以执行以下操作:

open("your_file.csv").each_line do |line|
  # do your stuff here like split lines
  line.split(",")

  # or store them in an array
  some_array << line

  # or write them back to a file
  some_file_handler << line
end
打开(“your_file.csv”)。每行|
#在这里做你的事就像分裂线一样
行。拆分(“,”)
#或者将它们存储在一个数组中

对于csv文件,您可以执行以下操作:

open("your_file.csv").each_line do |line|
  # do your stuff here like split lines
  line.split(",")

  # or store them in an array
  some_array << line

  # or write them back to a file
  some_file_handler << line
end
打开(“your_file.csv”)。每行|
#在这里做你的事就像分裂线一样
行。拆分(“,”)
#或者将它们存储在一个数组中

一些数组将CSV文件分解成块是正确的,但是您必须记住,每个块都需要保留CSV头的第一行

所以UNIX的“拆分”不会解决这个问题

您必须编写自己的小Ruby脚本,读取第一行并将其存储在一个变量中,然后将接下来的N行分发到一个新的部分CSV文件,但首先将CSV头行复制到其中。等等

在创建了每个带有标题和行块的文件之后,您可以使用Resque来登记这些文件,以便由Resque工作者进行并行处理


将CSV文件分为多个块是正确的,但您必须记住,每个块都需要保留CSV头的第一行

所以UNIX的“拆分”不会解决这个问题

您必须编写自己的小Ruby脚本,读取第一行并将其存储在一个变量中,然后将接下来的N行分发到一个新的部分CSV文件,但首先将CSV头行复制到其中。等等

在创建了每个带有标题和行块的文件之后,您可以使用Resque来登记这些文件,以便由Resque工作者进行并行处理


这是处理csv文件的错误方法。使用CSV库。是的,我们应该使用CSV库。但是好处呢?主要是引用和标题,更多的请看文档。另外,当你以正确的方式做事时,你会有一种良好的感觉:)这是处理csv文件的错误方式。使用CSV库。是的,我们应该使用CSV库。但是好处呢?主要是引用和标题,更多的请看文档。另外,当您以正确的方式做某事时,您会有一种良好的感觉:)瓶颈是磁盘。除非文件位于不同的磁盘上,否则将其拆分为较小的文件不太可能有帮助。这可能是真的,但如何避免磁盘访问呢。即使有多个线程,每个线程也需要一个文件句柄,或者每次线程要执行某些操作时都应该移动文件句柄位置。因此,对于单独的文件和单独的进程(或线程),您可以最小化由于I/O相关的线程挂起而导致的等待时间。我错了吗?拆分处理行,但CSV可以在引号字段中嵌入换行符,因此在一般情况下仅在换行符上拆分是有问题的。我想这取决于磁盘,但对我来说似乎不太可能。瓶颈是磁盘。除非文件位于不同的磁盘上,否则将其拆分为较小的文件不太可能有帮助。这可能是真的,但如何避免磁盘访问呢。即使有多个线程,每个线程也需要一个文件句柄,或者每次线程要执行某些操作时都应该移动文件句柄位置。因此,对于单独的文件和单独的进程(或线程),您可以最小化由于I/O相关的线程挂起而导致的等待时间。我错了吗?拆分处理行,但CSV可以在引用字段中嵌入换行符,因此在一般情况下,仅在换行符上拆分是有问题的。我想这取决于磁盘,但对我来说似乎不太可能。您处理的代价是什么?主要是CSV解析本身,还是后续计算?计算实际上是适合并行化还是依赖于先前的输入?您是否可以轻松识别记录分隔符(例如每个记录是否以“\n”结尾或是否可以将“\n”嵌入字段)?处理过程中代价高昂的部分是什么?主要是CSV解析本身,还是后续计算?计算实际上是适合并行化还是依赖于先前的输入?您能否轻松识别记录分隔符(例如,每条记录是否以“\n”结尾,或者“\n”是否可以嵌入到字段中)?