Задать вопрос
zmitrok62
@zmitrok62
Очень хороший человек

Как правильно читать строки из большого файла?

Добрый день. Необходимо брать первую строку большого файла, производить с ней действия и удалять. Файл размером в 600 Мб.
Замечу, что работа будет вестись в многопотоке. Т.е. сразу несколько потоков захотят одновременно почитать из файла и удалть строку.

Как правильно сделать?
Спасибо.

UPD1:
Вот так хорошо читается:
string line = File.ReadLines("file.txt").First();

Остался вопрос как удалить прочитанную строку и будет ли оно работать с многопотоком?
  • Вопрос задан
  • 131 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
@Sumor
Если планируется одновременная работа с данными, да ещё и их изменение, то лучше рассмотреть вопрос с БД.
Есть много вариантов простых встроенных в программу движков, которые обеспечат вам корректную одновременную работу с данными.

Если же хочется поиграться самому, то вот несколько моментов.
Для одновременной работы из нескольких потоков файл нужно открывать с опциями FileShare.Read или FileShare.ReadWrite. Особенности работы с ними прочитаете сами.
Удаление данных в начале файла приводит к его полному переписыванию операционной системой. То есть компьютер всё равно прочтёт 600 МБ, просто это будет не в вашем потоке.
Достаточно быстро просто помечать "удалённые строки" какими-то спецсимволами. Например, вы можете выделить под это первый символ строки. А очистку начала файла производить раз в 100-200-300-500 "удалений".
При этом, если вы планируете многопоточность, то нужно хорошо организовать их взаимодействие, а то получите дважды обработанные строки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
freeExec
@freeExec
Участник OpenStreetMap
string line = File.ReadLines("file.txt").First();

И вы читаете все 600Мб в память.
Ну и в многопотоке это будет работать только с блокировкой файла на время перезаписи. При таком размере это выльется в существенный лаг. На вашем месте я бы пересмотрел концепцию.
А так: ищите первый символ конца строки, запоминаете позицию. Зачет читаете кусок после неё и записываете в начало файла, читаете дальше и дописываете после первого блока и так до конца. В конце уже обрезаете размер файла под новый размер.
Ответ написан
@John_Nash
coder
сразу несколько потоков захотят одновременно почитать из файла и удалть строку

сомневаюсь, что такое вообще возможно, тем более в NTFS. Считайте, что каждый поток блокирует файл на время чтения/записи, поэтому длительные операции разбивайте на множество мелких
Ответ написан
@BashkaMen
C# программист
Можно выгрузить все в память потом сложить в очередь и уже там раздавать потокам.

Я б так сделал

var lines = File.ReadAllLines("file.txt", Encoding.UTF8);

            var queue = new ConcurrentQueue<string>(lines);

            Parallel.ForEach(queue, item =>
            {
                if (queue.TryDequeue(out var line))
                {
                    Console.WriteLine(line);
                }
            });
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы