2014-12-01 29 views
6

Bir CSV dosyasından (20 milyon satır) okuyarak büyük miktarda veri nasıl devam ettirilir. Bu, şu ana kadar 1 1/2 güne kadar koşuyor ve sadece 10 milyon satırlık bir süredir devam ediyor, bunu nasıl daha hızlı hale getirebiliyor ve bunu paralel bir şekilde yürütmek için bir imkan var.Bir CSV dosyasından okunarak büyük miktarda veri nasıl devam ettirilir?

CSV'yi okumak için buradaki kodu kullanıyorum, bunu başarmanın daha iyi bir yolu olup olmadığını öğrenmek istiyorum.

bakın: dealing with large CSV files (20G) in ruby

+0

Bellekte 20mil satırın hedefi nedir? Neden sadece her satırı okumuyor ve bunu bir SQLite veritabanına sıkıştırmıyorsunuz?(oradaki analizi yapın) Eğer büyük miktarda veriye çalışıyorsanız, MapReduce'a bakmak isteyeceksiniz. – Besto

+0

Tüm verileri işlemek ve daha fazla işlem için MySQL veritabanında saklamak istiyorum. Verileri okuduğum veya veriyi sürekli güncelleyebilmem için bana bilgi ver. Burada herhangi bir kod parçacığı için teşekkür ederiz. Ayrıca satırlar geçti mi? – brisk

+0

Örnek bir şema sağlayabilir misiniz? O zaman pasajı bir araya getireceğim. – Besto

cevap

4

Önce birkaç küçük dosyalar halinde dosya split deneyebilirsiniz, o zaman paralel olarak birkaç dosya işlemek mümkün olacaktır.

Muhtemelen dosyayı splintleme için sen, sen dosyaların her biri işleme ve varsayarak ederken Sonra bölünmüş

split -l 1000000 ./test.txt ./out-files- 

gibi bir araç kayıt eklenmesi yerine hepsini tek tek ekleyerek daha hızlı kullanıcıya olacak bunları toplu halde birleştirebilir ve toplu ekler yapabilir. Bir şey gibi:

INSERT INTO some_table 
VALUES 
(1,'data1'), 
(2, 'data2') 

iyi performans için bunu SQL hesabını kendiniz kurmak ve yürütmek gerekir:

ActiveRecord::Base.connection.execute('INSERT INTO <whatever you have built>') 
+2

Ayrıca, tüm eklerinizi bir 'ActiveRecord :: Base.transaction {}' bloğu içinde çalıştırdığınızdan emin olun. –

2

daha fazla işlenmek üzere MySQL için verilerinizi devam etmek istiyorum bu yana, Load kullanarak MySQL'den Data Infile daha hızlı olacaktır. =

sql " ALANLAR İLE İPTAL TABLO testlerinin INTO LOAD DATA LOCAL INFILE 'big_data.csv' '' '\ TARAFINDAN ENCLOSED"' '\ n' TARAFINDAN İPTAL HATLARI: En şema ile aşağıdaki gibi bir şey (foo, foo1)"

con = ActiveRecord :: Base.connection

con.execute (sQL)

+0

local_infile ekleyin: [link] 'e göre database.yml için true (http://stackoverflow.com/questions/21256641/enabling-local-infile-for-loading-data-into-remote-mysql-from-rails) – Graham

1

önemli noktalar:

  1. MySQL InnoDB motorunu kullanırsanız, tavsiyem, her zaman 'un bir PRIMARY KEY otomatik artış olduğunu tanımlar, InnoDB tablodaki verileri depolamak için kümelenmiş dizini kullanır. Kümelenmiş bir dizin, bir tablodaki verilerin fiziksel sırasını belirler.
    bakın: http://www.ovaistariq.net/521/understanding-innodb-clustered-indexes/
  2. Yapılandırma MySQL Sunucu parametreleri, en önemli olanları
    (2) innodb_buffer_pool_size binlog
    (1) yakın MySQL vardır. http://www.percona.com/blog/2013/09/20/innodb-performance-optimization-basics-updated/
  3. Sen yapımcı-tüketici senaryoyu kullanmalıdır:
    (3)
    (4) Bu okuyabilir
    bulk_insert_buffer_size innodb_flush_log_at_trx_commit. Fakir İngilizce'm için özür dilerim

İlgili konular