2

機械学習システムでのトレーニングとテストのために、CSV データセットを小さなデータセットに分割する宝石を探しています。ランダムサンプリングに基づいてこれを行うRのパッケージがあります。しかし私の調査では、Ruby については何も判明していません。これを Ruby で実行したかった理由は、元のデータセットが非常に大きい (たとえば 1700 万行または 5.5 ギガ) ためです。 Rは、データセット全体をメモリにロードすることを想定しています。Ruby ははるかに柔軟です。任意の提案をいただければ幸いです。

4

4 に答える 4

1

これにより、元のデータがすべてメモリに読み込まれることなく、2 つのファイルに分割されます。

require 'csv'

sample_perc = 0.75

CSV.open('sample.csv','w') do |sample_out|
  CSV.open('test.csv','w') do |test_out|
    CSV.foreach('alldata.csv') do |row|
      (Random.rand < sample_perc ? sample_out : test_out) << row
    end
  end
end
于 2013-03-30T21:39:15.357 に答える
0

smarter_csv Ruby gem を使用して、chunk_size を目的のサンプル サイズに設定し、チャンクを Resque jobs として保存して、並列処理することができます。

https://github.com/tilo/smarter_csv

その GitHub ページの例を参照してください。

于 2013-04-13T18:46:54.560 に答える
0

CSV は Ruby に組み込まれているため、これを行うために gem は必要ありません。

require 'csv'

csvs = (1..10).map{|i| CSV.open("data#{i}.csv", "w")}
CSV.foreach("data.csv") do |row|
  csvs.sample << row
end

CSV.foreach は、ファイル全体をメモリにロードしません。

于 2013-03-30T11:39:58.450 に答える