Чтение таблицы размещения файлов - PullRequest
1 голос
/ 21 июля 2010

Я работаю над пользовательским проводником файловой системы 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();
    }

Цепочка иногда может составлять сотни мегабайт.

И вот как я это пишу. Когда выделение и изменения в массиве uM chainMap выполнены, он в основном перебирает этот массив 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 голосов
/ 18 ноября 2010

Я провел много исследований и тестирований двоичной сериализации, и меня поразило то, что вы могли быстро читать довольно большие блоки с современными жесткими дисками и что львиная часть времени была потрачена на преобразование байтов в целые числа струны и т. д.

Итак, одну вещь, которую вы могли бы сделать, - это перестроить архитектуру, чтобы использовать все ваши ядра, сначала прочитать как можно больший блок данных, а затем использовать PLINQ или Parallel.net для фактической десериализации. Вы могли бы даже хотеть пойти еще дальше в образец производителя / потребителя. Вы увидите выгоды только для большого количества записей, больших блоков или данных, хотя в противном случае распараллеливание обычно не стоит.

Кроме того, у вас есть оператор поиска, который всегда дорог, попробуйте использовать файл с отображением в памяти или сразу же прочитать большой блок, если это возможно и применимо.

0 голосов
/ 21 июля 2010

Похоже, вы могли бы сегментировать его как-то.Вместо того, чтобы читать / писать целиком, блоки «страница в / из» в зависимости от использования.Подумайте о системах виртуальной памяти для вдохновения там.

...