Как воспользоваться преимуществами организации дискового ввода-вывода

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

Файл хранится в сети 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 ответа

Решение

Вы использовали Performance Monitor (от Microsoft Sysinternals) на этом?

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

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

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

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

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

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

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

Другие вопросы по тегам