Как использовать TextWriter для нескольких потребителей? - PullRequest
1 голос
/ 06 марта 2012

У меня есть BlockingCollection, и эта коллекция заполняется функциями нескольких производителей в разных потоках.

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

Мне нужна реализация для нескольких производителей и для нескольких потребителей.

Я могу использовать TextWriter.Synchronized () и блокировать перед методом записи, но это может потратить то же время на выполнение с одним TextWriter.

1 Ответ

0 голосов
/ 06 марта 2012

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

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

Если вам нужно быстрее, получить более быстрый диск (Solid State или RAID и т. Д.), Или вы можете просматривать двоичные файлы и записывать в них что-либо, используя BinaryWriter . Или когда вам действительно нужна последняя капля скорости, вы можете использовать структуры и маршаллировать их. Хотя это рискованно, если вы хотите переместить ваши файлы на другие платформы.

Редактировать : забыл о protobuf.net , это было бы мое предпочтительное решение для записи и чтения данных на диск. Это двоичный файл, быстрый и очень простой в использовании.

С уважением, Герт-Ян

...