gpt4 book ai didi

Ruby:比较两个哈希数组

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:18 28 4
gpt4 key购买 nike

我绝对是 ruby​​ 的新手(并且使用 1.9.1),因此非常感谢您的帮助。我对 Ruby 的了解都是通过使用 google 获得的。我正在尝试比较两个散列数组,并且由于大小的原因,它会变得很长并且会因内存不足而调情。任何帮助将不胜感激。

我有一个具有多种方法(初始化、打开、比较、剥离、输出)的类 (ParseCSV)。我现在的工作方式如下(这确实通过了我编写的测试,只是使用了一个小得多的数据集):


file1 = ParseCSV.new(“some_file”)
file2 = ParseCSV.new(“some_other_file”)

file1.open #this reads the file contents into an Array of Hash’s through the CSV library
file1.strip #This is just removing extra hash’s from each array index. So normally there are fifty hash’s in each array index, this is just done to help reduce memory consumption.

file2.open
file2.compare(“file1.storage”) #@storage is The array of hash’s from the open method

file2.output

现在我纠结的是比较方法。在较小的数据集上工作根本不是什么大问题,工作速度足够快。然而,在这种情况下,我将大约 400,000 条记录(全部读入哈希数组)与大约 450,000 条记录进行比较。我正在努力加快速度。我也不能在 file2 上运行 strip 方法。这是我现在的做法:


def compare(x)
#obviously just a verbose message
puts "Comparing and leaving behind non matching entries"

x.each do |row|
#@storage is the array of hashes
@storage.each_index do |y|
if row[@opts[:field]] == @storage[y][@opts[:field]]
@storage.delete_at(y)
end
end
end
end

希望这是有道理的。我知道这将是一个缓慢的过程,因为它必须每次迭代 400,000 行 440,000 次。但是对于如何加快速度并可能减少内存消耗,您有任何其他想法吗?

最佳答案

哎呀,这将是 O(n^2) 运行时间。讨厌。

更好的选择是使用内置的 Set类。

代码看起来像这样:

require 'set'

file1_content = load_file_content_into_array_here("some_file")
file2_content = load_file_content_into_array_here("some_other_file")

file1_set = Set[file1_content]

unique_elements = file1_set - file2_content

假设文件本身具有独特的内容。应该在一般情况下工作,但可能会有怪癖,具体取决于您的数据是什么样子以及您如何解析它,但只要这些行可以与 == 进行比较,它应该可以帮助您。

使用集合比使用嵌套循环遍历文件内容要快得多。

(是的,我实际上这样做是为了处理大约 200 万行的文件,因此它最终应该能够处理您的情况。如果您正在进行大量数据处理,Ruby 可能不是最佳选择虽然是工具)

关于Ruby:比较两个哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com