Как воспользоваться преимуществами организации очередей Disk IO - PullRequest
2 голосов
/ 21 августа 2009

Мне нужно прочитать небольшие последовательности данных из файла 3,7 ГБ. Позиции, которые мне нужно прочитать, это , а не смежные , но я могу заказать IO так, чтобы файл читался от начала до конца.

Файл хранится в сети iSCSI SAN, которая должна быть способна обрабатывать / оптимизировать ввод-вывод в очереди.

Вопрос в том, как сделать за один раз запрос всех данных / позиций, которые мне нужны? Является ли это возможным? Я не думаю, что асинхронный ввод-вывод является опцией, потому что чтение очень мало (20-200 байт)

В настоящее время код выглядит так:

using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    for (int i = 0; i < internalIds.Count();i++ )
    {
        fileStream.Position = seekPositions[i].SeekPosition;
        ... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128);

    }
    ...
}

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

Ответы [ 3 ]

1 голос
/ 21 августа 2009

Вы запускали системный монитор (от Microsoft Sysinternals) на этом?

Я не уверен, в чем проблема, но я сделаю предположение. Если вы читаете из SAN, я думаю, что доступ к диску приведет к сетевым запросам. Первое чтение отправляет запрос на поиск, считывает и буферизует данные, а затем Serializer создает объекты. К тому времени, как ваш второй запрос будет отправлен, диски SAN продолжат вращаться, поэтому вам придется ждать, пока данные вращаются на месте.

Вы пробовали многопоточность? Меня интересует производительность, если вы устанавливаете очередь файловых секций, которую нужно обрабатывать в последовательном порядке, раскручиваете несколько потоков, открываете файл отдельно (FileSharing.Read, чтобы они все могли получить доступ к файлу сразу) затем пусть они начнут захватывать работу из очереди. Выведите результаты в другую коллекцию. Если для вывода важен порядок, вы сортируете выходные данные по исходному порядку, в котором вы их поставили в очередь.

--- РЕДАКТИРОВАТЬ ---

Вы пробовали ReadFileScatter API ? Вот подпись P-invoke от pinvoke.net .

0 голосов
/ 03 сентября 2009

Только для записи:

В средах POSIX вы можете запросить несколько областей файла одним (sys-) вызовом, используя функцию readv . Еще одна функция в среде POSIX - неблокирующий ввод-вывод.

0 голосов
/ 21 августа 2009

Сделать одиночный фоновый поток в качестве прокси диска. Отправьте все свои операции чтения на него, и пусть он сортирует и объединяет чтения. Если два или более регионов находятся близко, прочитайте полный сектор, содержащий их, и возьмите подразделы данных. Вернуть данные асинхронно.

...