Ruby比较非常大的文件

时间:2019-07-20 03:23:05

标签: amazon-s3

我有两个CSV文件,它们是S3存储桶对象的列表:

The first CSV file represents the objects in the source S3 bucket. 
The second CSV file represents the objects in the destination S3 bucket. 

我需要通过查找目标存储桶中尚未存在的对象,来了解将哪些文件从源S3存储桶复制到目标存储桶。 CSV的行与路径,大小和修改日期匹配。如果其中任何一个不同,我需要将源对象复制到目标存储桶。

这是第一个示例CSV文件:

folder1/sample/test1,55,2019-07-19 19:36:56 UTC
folder2/sample/test5,55,2019-07-19 19:34:31 UTC
folder3/sample/test9,55,2019-07-19 19:32:12 UTC

这是第二个示例CSV文件:

folder1/sample/test1,55,2019-07-16 19:32:58 UTC
folder2/sample/test5,55,2019-07-14 19:34:31 UTC
folder3/sample/test9,55,2019-07-19 19:32:12 UTC

在此示例中,将返回第一行和第二行。

以下代码可在这3个衬纸上使用,但在1000+行随机生成的文件上将失败:

f1 = File.open('file1.csv', 'r')
f2 = File.open('file2.csv', 'r')

f1.each.zip(f2.each).each do |line1, line2|
  if line1 != line2
    puts line1
  end
end

如何准确比较所有行-最好以最少的CPU /内存开销为准?

1 个答案:

答案 0 :(得分:0)

您可以将目标列表加载到内存中的数组中,然后一次单行浏览源列表。如果源行不在数组中,则需要复制文件。

如果即使一个文件太大也无法加载到内存中,并且文件按文件名顺序排序,则可以一起浏览两个文件并比较行。您需要使用文件名来确定是否跳过行以保持同步。

另一种选择是使用 Amazon Athena ,将文件之间的数据连接起来以查找不匹配的行。