Ruby: Porównanie dwóch tablic haszy

Jestem zdecydowanie nowicjuszem do ruby ​​(i przy użyciu 1.9.1), więc każda pomoc jest doceniana. Wszystko, czego nauczyłem się o Rubim, pochodzi z Google. Próbuję porównać dwie tablice skrótów i ze względu na rozmiary, robi się to długo i flirtuje z brakiem pamięci. Każda pomoc byłaby doceniana.

Mam klasę (ParseCSV) z wieloma metodami (inicjowanie, otwieranie, porównywanie, usuwanie, wyprowadzanie). Sposób, w jaki to teraz działa, jest następujący (i to przechodzi testy, które napisałem, używając znacznie mniejszego zestawu danych):


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

Teraz walczę z metodą porównywania. Praca na mniejszych zestawach danych to nic wielkiego, działa wystarczająco szybko. Jednak w tym przypadku porównuję około 400 000 rekordów (wszystkie odczytane w tablicy haszy) z rekordami, które mają około 450 000 rekordów. Próbuję to przyspieszyć. Nie mogę również uruchomić metody strip w pliku2. Oto jak to teraz robię:


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

Mam nadzieję, że to ma sens. Wiem, że będzie to powolny proces tylko dlatego, że musi iterować 400 000 wierszy po 440 000 razy. Ale czy masz jakieś inne pomysły, jak przyspieszyć i ewentualnie zmniejszyć zużycie pamięci?

questionAnswers(2)

yourAnswerToTheQuestion