2015-01-09 4 views
0

У меня есть приложение на C#, которое включает в себя множество операций с файлами, то есть чтение, перемещение, удаление, добавление и т. Д. Например, файл считывается из исходного пути в локальной FS и после обработки , он удаляется оттуда, и обработанный файл записывается в целевое местоположение локального FS. Все это делается параллельно с группой систем, каждая из которых работает только с локальными файлами. (Файлы распределялись между ними с помощью балансировки нагрузки)Оптимизация операций с файлами

Как я могу улучшить производительность этого приложения?

Вещи, которые я могу думать о том, являются:

1.) Создайте очередь для конкретного типа операции, такие как удаление. Поместите необходимую информацию в очередь, и отдельный поток будет обрабатывать очередь.

2.) Вместо работы с FS используйте хранилище данных в памяти, такое как Redis. По мере того, как данные будут в кеше, операции будут выполняться быстрее.

3.) Увеличение параллелизма кода. Каждый поток будет работать над отдельным файлом и должен быть быстрее.

Будут ли вышеприведенные подходы работать? Пожалуйста, предложите любые другие альтернативы, которые, возможно, стоит подумать.

+0

Если у вас не более одного физического жесткого диска, над которым вы работаете, параллелизм на самом деле не принесет вам никакой пользы. Говорить, что диск, чтобы делать 3 вещи одновременно, будет включать в себя 2 из тех вещей, которые ждут, пока не будет сделано первое, а не 3-кратное ускорение. – Servy

+0

@Servy, поэтому вы говорите, что на физическом жестком диске может произойти только одна операция, хотя операции связаны с разными файлами. – ptntialunrlsd

+1

@ptntialunrlsd На жестком диске имеется только одна голова, поэтому да, это может быть только чтение/запись в один файл за раз, если у вас нет нескольких дисков. То, что вы манипулируете несколькими файлами, не меняет этого. – Servy

ответ

0

1.) Я хотел бы предложить совместное использование общих операций контекста для сокращения переходов на синхронизацию и использование механизма кэширования вашего процессора. 2.) Группировка файлов вместе с одним файлом приведет к уменьшению количества рукопожатий в Windows для снижения производительности файла. 3.) Попробуйте использовать указатель и \ или Win32 API, которые во многих случаях выглядят быстрее, чем их управляемые оболочки \ lib. 4.) Блокировка очередей сбора (потребитель-производитель) может быть хорошей отправной точкой.

Смежные вопросы