文件分配表读数

时间:2010-07-21 16:38:40

标签: c# filesystems fat32 fat

我正在开发一个自定义FAT文件系统资源管理器,事情进展顺利。但是,我想知道是否有更好的方法来有效地读/写链图。对于大型设备,这可能是令人难以置信的资源密集型,而且可能非常非常慢。特别是在分配空间时。

以下是我的阅读方式:

    public void ReadChainMap()
    {
        chainMap = new uint[clusterCount];
        fx.Io.SeekTo(chainMapOffset);
        EndianIo io = new EndianIo(fx.Io.In.ReadBytes((int)chainMapSize), EndianType.BigEndian);
        io.Open();

        for (int x = 0; x < clusterCount; x++)
            chainMap[x] = (chainMapEntrySize == 2) ?
                io.In.ReadUInt16() : io.In.ReadUInt32();


        io.Close();
    }

链条有时可能达到数百兆字节。

这就是我写它的方式。在完成对chainMap uint数组的分配和修改后,它将基本循环遍历该uint数组并重写整个链映射。

    public void WriteChainMap()
    {
        EndianIo io = new EndianIo(new byte[chainMapSize],
            EndianType.BigEndian);
        io.Open(); io.SeekTo(0);

        for (int x = 0; x < clusterCount; x++)
            if (chainMapEntrySize == 2)
                io.Out.Write((ushort)chainMap[x]);
            else
                io.Out.Write(chainMap[x]);

        fx.Io.SeekTo(chainMapOffset);
        fx.Io.Out.Write(io.ToArray());
    }

我一直在研究缓存系统,但我希望有更多关于如何做到这一点的想法。

2 个答案:

答案 0 :(得分:0)

似乎你可以用某种方式对其进行分割。而不是读/写整个事物,“页面输入/输出”块基于使用情况。想想虚拟内存系统的灵感。

答案 1 :(得分:0)

我自己做了很多关于二进制序列化的研究和测试,让我印象深刻的是,你可以用今天的硬盘快速读取相当大的块,并且狮子部分时间实际上是将字节转换为整数,字符串等

所以,你可以做的一件事就是重新架构以利用你的所有核心,首先读取尽可能大的数据块,然后使用PLINQ或Parallel.net进行实际的反序列化。您甚至可能希望进一步深入生产者/消费者模式。您只能看到大量条目或大块或数据的收益,否则它通常不值得并行化。

此外,你有一个寻求陈述,那些总是很昂贵,尝试使用memorymapped文件或尽可能适当地阅读大块。