1

我正在开发一个自定义 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数组并重写整个chainmap。

    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());
    }

我一直在研究缓存系统,但我想对如何让它变得更好有更多的想法。

4

2 回答 2

0

似乎您可以以某种方式对其进行分段。不是读/写整个东西,而是根据使用情况“页面输入/输出”块。考虑一下虚拟内存系统以获得灵感。

于 2010-07-21T16:44:49.687 回答
0

我自己对二进制序列化进行了大量研究和测试,令我印象深刻的一件事是,您可以使用当今的硬盘驱动器快速读取相当大的块,并且大部分时间实际上都用于将字节转换为整数、字符串等。

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

此外,您有一个 seek 语句,这些语句总是很昂贵,如果可能且适用,请尝试使用 memorymappedfile 或立即读取一个大块。

于 2010-11-17T23:29:50.160 回答