У меня есть двоичный файл, закодированный с небольшим количеством 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;
}
«на данный момент FilePath действителен и существует ...» Проверка файла. Exists и открытие файла предоставляет окно возможности для файла не существовать (состояние гонки). Вы должны пропустить тест File.Exists, поскольку он избыточен. Кроме того, попытка открыть его приведет к созданию FileNotFoundException, которое будет гораздо более описательным, чем ArgumentException. – Tergiver
спасибо Tergiver, рассмотрит ваш ввод и уточнит мой код. –