C# 如何从二进制文件优化数据加载

C# 如何从二进制文件优化数据加载,c#,.net,binary-data,endianness,C#,.net,Binary Data,Endianness,我有一个用little endian编码的二进制文件,包含大约250.000个var1值,然后是另一个相同数量的var2值。我应该创建一个方法来读取文件并返回一个数据集,其中包含var1和var2列中的值 我正在使用库:这里多次提到,请参见此处了解详细信息: 非常感谢您提供此服务。:) 我有下面的代码在工作,我对如何最小化从文件读取和填充数据表的for循环的更好想法感兴趣。有什么建议吗 private static DataSet parseBinaryFile(string filePath)

我有一个用little endian编码的二进制文件,包含大约250.000个var1值,然后是另一个相同数量的var2值。我应该创建一个方法来读取文件并返回一个数据集,其中包含var1和var2列中的值

我正在使用库:这里多次提到,请参见此处了解详细信息:

非常感谢您提供此服务。:)

我有下面的代码在工作,我对如何最小化从文件读取和填充数据表的for循环的更好想法感兴趣。有什么建议吗

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;
} 
私有静态数据集parseBinaryFile(字符串文件路径)
{
var result=新数据集();
var table=result.Tables.Add(“数据”);
表.列.添加(“索引”,类型(int));
表.列.加上(“雨”,类型(浮动));
表.列.添加(“gnum”,类型(浮动));
const int samplescont=259200;//720*360
float[]vRain=新的float[samplesCount];
float[]vStations=新的float[samplesCount];
尝试
{
if(string.IsNullOrWhiteSpace(filePath)| |!File.Exists(filePath))
{
抛出新ArgumentException(string.Format(“无法打开文件:{0}',filePath));
}

//此时,文件路径有效且已存在。。。 使用(FileStream fs=newfilestream(filePath,FileMode.Open)) { //我们正在使用此处找到的库:http://www.yoda.arachsys.com/csharp/miscutil/ var reader=new missutil.IO.EndianBinaryReader(missutil.Conversion.LittleEndianBitConverter.Little,fs); int i=0; while(reader.BaseStream.Position
选项#1

将整个文件读入内存(或内存映射),并循环一次

选项2

在读取带有var2占位符值的var1部分时,添加所有数据表行。然后在阅读var2部分时修复数据表。

选项#1

将整个文件读入内存(或内存映射),并循环一次

选项2


在读取带有var2占位符值的var1部分时,添加所有数据表行。然后在阅读var2部分时修复数据表。

“此时文件路径有效且存在…”检查File.exists并打开一个文件为文件不存在提供了机会窗口(竞争条件)。您应该跳过文件.Exists测试,因为它是多余的。此外,尝试打开它将产生比ArgumentException.thanks Tergiver更具描述性的FieloToFuntExpCube,将考虑您的输入并细化我的代码。“此时FielPATH有效且存在……”检查文件。存在并打开文件提供文件不存在的机会窗口(RACE条件)。您应该跳过文件.Exists测试,因为它是多余的。此外,尝试打开它将产生比ArgumentException.thanks Tergiver更具描述性的FieloToFunExtPosit,将考虑您的输入并细化我的代码。