2016-06-15 18 views
0

ランダムサンプリングでデータセットを生成し、出力のサイズを制限することは可能ですか?ファイルサイズによるランダムサンプリングの制限

私は〜260MBのテキストファイルの入力があり、ソースファイルからランダムに生成された異なるサイズ(〜1MB、〜5MB、〜10MB、...)のファイルを生成したいと思います。

これにはどのような方法が最適ですか?

答えて

0

最も簡単な方法は、出力するときにファイルを読み込んでスキップすることです。

n番目の行ごとにモジュラス(%)を使用します。スキップ行をサンプルファイルのサイズ/ requireファイルのサイズに設定します。たとえば、260MB/5MB = 52なので、%演算子を52に設定すると、約5MBのファイルが得られます。ランダマイザー付き

 StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv")); 

     StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv")); 

     int rowCount = 0; 
     while(!inputFile.EndOfStream) 
     { 
      string line = inputFile.ReadLine(); 

      if (rowCount % 1000 == 1) 
       outputFile.WriteLine(line); 

      rowCount++; 
     } 

要求通り:

は、ここで簡単な例です。このバージョンでは、5MBを作る行数を計算します(私は10万を置いています)。これは、100,000行がロードされるまでファイルをランダムにループします。すべての行を取得する前に終了した場合は、ファイルを再度読み始めるだけです。これは「非常に」ランダムになります。

 StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv")); 

     StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv")); 

     Random rand = new Random(Guid.NewGuid().GetHashCode()); 

     int rowCount = 0; 
     int rowsUsed = 0; 
     skipCount = rnd.Next(1, 2000); 

     while(rowsUsed < 100000) 
     { 
     while(!inputFile.EndOfStream || rowsUsed > 100000) 
     { 
      string line = inputFile.ReadLine(); 

      if (rowCount % skipCount == 1) 
      { 
       outputFile.WriteLine(line); 
       skipCount = rnd.Next(1, 2000); 
      } 

      rowCount++; 
     } 

     StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv")); 
     } 
+0

これにより、毎回同じ5MBのファイルが生成されます。右? 5MBのファイルが必要ですが、毎回同じではありません。私の最初の実装は、ランダムな項目を選択し、_n_個の項目をスキップすることです。しかし、出力のファイルサイズを決定する方法はありません。 ファイルごとに異なるコンテンツを生成する方法を教えてください。あるいは、書き込み前にファイルサイズをあらかじめ決めておいたり見積もる方法はありますか?編集時に – Awoi

+0

と答えてください。 –

関連する問題