2016-06-15 4 views
0

무작위 샘플링으로 데이터 세트를 생성하고 출력 크기를 제한 할 수 있습니까?파일 크기에 의한 랜덤 샘플링 제한

~ 260MB 텍스트 파일의 입력이 있고 원본 파일에서 무작위로 항목이 생성되는 다양한 크기 (~ 1MB, ~ 5MB, ~ 10MB, ...)의 파일을 생성하고 싶습니다.

가장 좋은 방법은 무엇입니까?

답변

0

가장 쉬운 방법은 출력 할 때 파일을 읽고 건너 뛰는 것입니다.

계수 (%)를 사용하여 매 n 번째 행을 가져옵니다. 스킵 행을 샘플 파일의 크기/요구 파일의 크기로 설정하십시오. 예를 들어 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

위의 답변. –