2012-06-19 4 views
1

У меня есть двоичный файл, закодированный с небольшим количеством endian и содержащий ~ 250.000 значений var1, а затем еще одно такое же количество значений var2. Я должен сделать метод, который читает файл и возвращает DataSet с этими значениями в столбцах var1 и var2.Как оптимизировать загрузку данных из двоичного файла

Я использую библиотеку: miscutil упоминается здесь в SO несколько раз, смотрите здесь, а также для деталей: will there be an update on MiscUtil for .Net 4?

спасибо большое Jon Skeet за то, что доступно. :)

У меня следующий код работает, меня интересуют лучшие идеи о том, как минимизировать циклы for для чтения из файла и для заполнения DataTable. Любое предложение?

private static DataSet parseBinaryFile(string filePath) 
{ 
    var result = new DataSet(); 

    var table = result.Tables.Add("Data"); 

    table.Columns.Add("Index", typeof(int)); 
    table.Columns.Add("rain", typeof(float)); 
    table.Columns.Add("gnum", typeof(float)); 

    const int samplesCount = 259200; // 720 * 360 

    float[] vRain = new float[samplesCount]; 
    float[] vStations = new float[samplesCount]; 

    try 
    { 
     if (string.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath)) 
     { 
      throw new ArgumentException(string.Format("Unable to open the file: '{0}'", filePath)); 
     } 

     // at this point FilePath is valid and exists... 
     using (FileStream fs = new FileStream(filePath, FileMode.Open)) 
     { 
      // We are using the library found here: http://www.yoda.arachsys.com/csharp/miscutil/ 
      var reader = new MiscUtil.IO.EndianBinaryReader(MiscUtil.Conversion.LittleEndianBitConverter.Little, fs); 

      int i = 0; 

      while (reader.BaseStream.Position < reader.BaseStream.Length) //while (pos < length) 
      { 
       // Read Data 

       float buffer = reader.ReadSingle(); 

       if (i < samplesCount) 
       { 
        vRain[i] = buffer; 
       } 
       else 
       { 
        vStations[i-samplesCount] = buffer; 
       } 

       ++i; 
      } 

      Console.WriteLine("number of reads was: {0}", (i/2).ToString("N0")); 
     } 

     for (int j = 0; j < samplesCount; ++j) 
     { 
      table.Rows.Add(new object[] { j + 1, vRain[j], vStations[j] }); 
     } 
    } 
    catch (Exception exc) 
    { 
     Debug.WriteLine(exc.Message); 
    } 

    return result; 
} 
+0

«на данный момент FilePath действителен и существует ...» Проверка файла. Exists и открытие файла предоставляет окно возможности для файла не существовать (состояние гонки). Вы должны пропустить тест File.Exists, поскольку он избыточен. Кроме того, попытка открыть его приведет к созданию FileNotFoundException, которое будет гораздо более описательным, чем ArgumentException. – Tergiver

+0

спасибо Tergiver, рассмотрит ваш ввод и уточнит мой код. –

ответ

1

Вариант № 1

Читать весь файл в памяти (или память карты его) и цикла один раз.

Вариант № 2

Добавить все строки таблицы данных, как вы читаете раздел переменная1 со значением заполнителя для var2. Затем закрепите таблицу данных при чтении раздела var2.

Смежные вопросы