Как обойти узкое место ввода / вывода при записи в несколько файлов с использованием нескольких потоков - PullRequest
0 голосов
/ 15 ноября 2011

В настоящее время у меня есть многопоточная программа, которая сканирует веб-сайты и записывает их текст в файл.С точки зрения использования процессора, я мог бы одновременно запускать тонны потоков, но быстро ввод-вывод становится узким местом.Я думал, что мог бы каждый поток записать в очередь блокировки массива, но я знаю, что собираюсь сгенерировать больше, чем мои доступные 32 ГБ оперативной памяти.Есть ли способ создать массив данных в текстовом файле после того, как он достигнет определенного размера, чтобы я мог освободить это пространство?Или есть другой способ обойти эту проблему ввода / вывода, которую я пропускаю?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Давайте возьмем образ контроллера SATA 2, который позволяет писать со скоростью 300 МБ в секунду. Теперь вопрос в том, какова пропускная способность интернет-соединения нашего воображаемого компьютера. Я знаю, что последняя максимальная пропускная способность, поддерживаемая адаптерами Ethernet, составляет 1 ГБ в секунду. Но я думаю, что такая пропускная способность интернет-соединения очень дорога (я даже сомневаюсь, что некоторые коммерческие хосты поддерживают это). Я думаю, что 300 МБ в секунду интернет-соединения достаточно. Пусть у нашего компьютера есть такой.

Результат

      Input (300 MB/s);

      Writing (300 MB/s).

Резюме: если вы хотите загрузить Интернет, вы должны увеличить количество подключений и дисков, а также контроллеров дисков. В противном случае 300 МБ / с выглядит довольно красиво. И темы вам не помогают. Процессор и память также не относятся к нашей проблеме.

1 голос
/ 15 ноября 2011

У меня не было бы "тонны" запущенных потоков. Я бы профилировал с переменным числом потоков в конкретной системе, пока не нашел количество потоков считывателей, обеспечивающих максимальную пропускную способность. Я подозреваю, что это число будет довольно маленьким. По сути, вы просто хотите, чтобы процессор был занят, ожидая ответов других серверов.

У меня будет один поток записи для каждого физического диска, на который вы пишете. Соедините темы чтения с потоком писателя с помощью BlockingQueue с конечным размером; если читатели окажутся слишком далеко впереди диска, это ограничит их активность.

0 голосов
/ 16 ноября 2011

Используйте меньше тем!Они не покупают тебя много.Вся проблема связана с сетью на одном конце и с диском на другом.На самом деле задействовано совсем немного процессора.

0 голосов
/ 15 ноября 2011

Полагаю, что именно дисковый ввод-вывод является узким местом из-за перебора большого количества файлов, да?Можете ли вы писать целые файлы одновременно - сканировать сайт, добавлять буферы в коллекцию буферов, а затем ставить очередь в коллекцию буферов в один поток записи файлов?Эта последовательная запись улучшит производительность диска, да?Если буферизация целых сайтов невозможна, то вы можете собрать достаточно экземпляров буфера для каждого сайта, чтобы сделать запись диска на некоторое время (не знаю, когда общее количество собранных файлов превышает 64 КБ, скажем), прежде чем поставить коллекцию в очередь из потока записи и начатьсобрать новый набор буферов.

Простой способ улучшить задержку записи в несколько файлов - получить SSD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...