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配列をループし、チェーンマップ全体を書き換えます。

    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

私は自分でバイナリシリアル化について多くの調査とテストを行いましたが、私が驚いたことの1つは、今日のハードドライブでかなり大きなブロックをすばやく読み取ることができ、実際にバイトを整数や文字列などに変換するのにかなりの時間が費やされたことです。

したがって、実行できることの1つは、すべてのコアを利用するための再構築です。最初に可能な限り大きなデータブロックを読み取り、次にPLINQまたはParallel.netを使用して実際のデシリアライズを実行します。生産者/消費者のパターンをさらに掘り下げたいと思うかもしれません。多数のエントリまたは大きなブロックまたはデータのゲインのみが表示されますが、それ以外の場合は通常、並列化する価値はありません。

また、seekステートメントがあります。これらは常に高価です。メモリマップトファイルを使用するか、可能であればすぐに大きなブロックを読み取ってみてください。

于 2010-11-17T23:29:50.160 に答える
0

どうにか分割できそ​​うです。全体を読み書きするのではなく、使用状況に基づいてチャンクを「ページイン/アウト」します。そこでインスピレーションを得るための仮想記憶システムについて考えてみてください。

于 2010-07-21T16:44:49.687 に答える