Лок записи в файл при мультипотоке

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 281
Благодарностей
877
Баллы
113
Записываю данные в файл через File.AppendAllLines(file, data) и возникла проблема с работой многопотока. Стандартные локи есть для списка, таблицы и буфера обмена. Можно ли сделать так же для записи в файл или проще пустить многопоток на заполнение списка: lock(SyncObjects.ListSyncer) { } и потом уже одним разом записать все полученные данные в файл?
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
lock блокирует любой код.
Запись в файл, список, таблицу или, допустим, нужно в многопотоке создавать названия для папок или файлов уникальным ид. Лочим сниппет получения юникстайм и делаем паузу в секунду.
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 416
Баллы
113
Даже lock не сильно спасает при большом количестве потоков. Уже при 150 потоках и большом размере файла начинаются тормоза. Решил эту проблему записью пачками и спокойно разогнался до 800 потоков. У каждого потока свой список не привязанный к файлу, а запись в общий список происходит по 100(любое количество) строк или по бэдэнду(по любому другому условию, предусмотренному в логике работы).
 
  • Спасибо
Реакции: Sergodjan и Zedx

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 281
Благодарностей
877
Баллы
113
Даже lock не сильно спасает при большом количестве потоков. Уже при 150 потоках и большом размере файла начинаются тормоза. Решил эту проблему записью пачками и спокойно разогнался до 800 потоков. У каждого потока свой список не привязанный к файлу, а запись в общий список происходит по 100(любое количество) строк или по бэдэнду(по любому другому условию, предусмотренному в логике работы).
Думаю сделаю так же :az:
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Даже lock не сильно спасает при большом количестве потоков. Уже при 150 потоках и большом размере файла начинаются тормоза. Решил эту проблему записью пачками и спокойно разогнался до 800 потоков. У каждого потока свой список не привязанный к файлу, а запись в общий список происходит по 100(любое количество) строк или по бэдэнду(по любому другому условию, предусмотренному в логике работы).
Тут смотря что и как парсить. Можно в кучу потоков без локов сохранять в файлы, а потом обьеденить в одином потоке все данные из файлов в таблицу или список, проверку на дубли делать по имени файла которое может называться какимто ид из урла страници ил логином юзера.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 861
Баллы
113

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)