Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825

Обработать файл большого размера

28.09.2018, 00:11. Показов 6508. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, форумчане. Стоит задача обработать каждую строку файла (построчное считывание), файл может достигать 50гб размера, как это сделать быстро? Возможно даже на языке C++ , если там эта операция происходит быстрее

Добавлено через 12 минут
Считать строку, обработать регуляркой и записать в другой файл если быть точным. Но для очень больших файлов с максимальной оптимизацией. В интернете полно таких тем, но никто конкретное решение так и не предложил. В основном все предлагают стандартный streamReader
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2018, 00:11
Ответы с готовыми решениями:

Файл или массив большого размера вывести на экран через буфер маленького размера
Приветствую! Суть: нужно продеть слона int slon длиной 13467 через игольное ушко byte uho = new byte, чтобы часть слона, прошедшая через...

Открытие файла большого размера
Имеется задача, нужно открыть бинарный файл больших размеров, так, чтобы не произошло переполнение оперативной памяти! Подскажите...

Создать матрицу большого размера
Добрый день. Я начинающий программист и столкнулся с такой проблемой: byte A= new byte; При N=100000; Выдаётся исключение...

66
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.09.2018, 05:54
Студворк — интернет-сервис помощи студентам
Start ByteArrayVariant...
Time: 00:00:07.5850754
Start SingleByteVariant...
Time: 00:00:11.8710398
Start DoubleBufferVariant...
Time: 00:00:03.9840769
Start C++ variant...
Time: 00:00:03.0319354

DoubleBuffer - все то же самое, как и в ByteArray. Только буфера 2 и запись запускается асинхронно. Это позволяет "скрыть" вычисления за записью.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private static void DoubleBufferVariant(string inputFilePath, string outputFilePath)
{
    Console.WriteLine("Start DoubleBufferVariant...");
    var sw = Stopwatch.StartNew();
 
    if (File.Exists(outputFilePath))
        File.Delete(outputFilePath);
 
    var bufferSize = 1024 * 1024 * 30;
 
    using (var outStream = new FileStream(outputFilePath, FileMode.Create))
    using (var inStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize))
    {
        Task t = null;
        var copy = true;
        var buffer = new byte[bufferSize];
        var outBuffer = new byte[][] { new byte[bufferSize], new byte[bufferSize] };
        var count = 0;
 
        while ((count = inStream.Read(buffer, 0, bufferSize)) > 0)
        {
            var outBufferCounter = 0;
 
            for (int i = 0; i < count; i++)
            {
                var tmp = buffer[i];
                if (tmp == '@')
                    copy = false;
                else if (tmp == ':' || tmp == ';' || tmp == '\r' || tmp == '\n')
                    copy = true;
 
                if (copy)
                    outBuffer[0][outBufferCounter++] = (byte)tmp;
            }
 
            //flush output stream
            if (t != null)
                t.Wait();
            t = Task.Run(() => outStream.Write(outBuffer[0], 0, outBufferCounter));

C++ - просто перевод. чтение/запись через _fwrite_nolock(), _fread_nolock()
3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.09.2018, 11:21
avgoor, Идея хорошая, но реализация - откровенно неправильная. Буферы не переключаются, outBufferCounter не тот, конечная порция не записывается.
У вас оно работает быстрее, потому что переменная outBufferCounter обнуляется и вы просто записываете пустые буферы в выходной поток:



Если же сделать более-менее правильно, то результат - хуже чем массив byte[]:



PS Хотя нет, захват переменной там же нормальный должен быть, ведь это под NET 4.5. Но все равно на моей машине время хуже.
Напишите правильно работающий вариант, тогда протестируем.
2
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
30.09.2018, 16:56
Вот так отработало на моём ноутбуке.
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Try №1
Running DoubleBufferedFileProcessor... 00:00:14.2506538
Running ByteArrayFileProcessor... 00:00:08.8889457
Running SingleByteFileProcessor... 00:00:15.6920553
Try №2
Running SingleByteFileProcessor... 00:00:15.5844119
Running DoubleBufferedFileProcessor... 00:00:09.9779621
Running ByteArrayFileProcessor... 00:00:08.4800687
Try №3
Running SingleByteFileProcessor... 00:00:15.3979698
Running ByteArrayFileProcessor... 00:00:09.2820618
Running DoubleBufferedFileProcessor... 00:00:09.1800287
Try №4
Running SingleByteFileProcessor... 00:00:15.3622298
Running DoubleBufferedFileProcessor... 00:00:09.1518118
Running ByteArrayFileProcessor... 00:00:10.1933443
Try №5
Running ByteArrayFileProcessor... 00:00:09.5710545
Running SingleByteFileProcessor... 00:00:15.4882829
Running DoubleBufferedFileProcessor... 00:00:08.5700136
Try №6
Running ByteArrayFileProcessor... 00:00:08.7483608
Running DoubleBufferedFileProcessor... 00:00:07.8277471
Running SingleByteFileProcessor... 00:00:15.4573163
Try №7
Running DoubleBufferedFileProcessor... 00:00:08.4626362
Running ByteArrayFileProcessor... 00:00:08.6071173
Running SingleByteFileProcessor... 00:00:15.5154940
Try №8
Running SingleByteFileProcessor... 00:00:15.4669558
Running ByteArrayFileProcessor... 00:00:10.5554377
Running DoubleBufferedFileProcessor... 00:00:10.0477790
Try №9
Running DoubleBufferedFileProcessor... 00:00:08.3786749
Running ByteArrayFileProcessor... 00:00:09.3417046
Running SingleByteFileProcessor... 00:00:15.5014454
Try №10
Running DoubleBufferedFileProcessor... 00:00:09.7112681
Running SingleByteFileProcessor... 00:00:15.3617457
Running ByteArrayFileProcessor... 00:00:10.0765210
Try №11
Running SingleByteFileProcessor... 00:00:15.3250324
Running ByteArrayFileProcessor... 00:00:08.8629123
Running DoubleBufferedFileProcessor... 00:00:09.5526957
Try №12
Running SingleByteFileProcessor... 00:00:15.4738640
Running DoubleBufferedFileProcessor... 00:00:08.8567239
Running ByteArrayFileProcessor... 00:00:09.5060798
Try №13
Running SingleByteFileProcessor... 00:00:15.3587060
Running DoubleBufferedFileProcessor... 00:00:08.9970056
Running ByteArrayFileProcessor... 00:00:10.3449910
Try №14
Running ByteArrayFileProcessor... 00:00:09.8553298
Running SingleByteFileProcessor... 00:00:15.4308904
Running DoubleBufferedFileProcessor... 00:00:08.7583668
Try №15
Running DoubleBufferedFileProcessor... 00:00:08.1340611
Running SingleByteFileProcessor... 00:00:15.4157817
Running ByteArrayFileProcessor... 00:00:09.4379089
Try №16
Running ByteArrayFileProcessor... 00:00:09.0538015
Running SingleByteFileProcessor... 00:00:15.3758537
Running DoubleBufferedFileProcessor... 00:00:07.8715016
Try №17
Running DoubleBufferedFileProcessor... 00:00:08.9729698
Running ByteArrayFileProcessor... 00:00:09.3358210
Running SingleByteFileProcessor... 00:00:15.4208091
Try №18
Running DoubleBufferedFileProcessor... 00:00:09.7477540
Running SingleByteFileProcessor... 00:00:15.3787754
Running ByteArrayFileProcessor... 00:00:09.7885534
Try №19
Running SingleByteFileProcessor... 00:00:15.3460734
Running DoubleBufferedFileProcessor... 00:00:10.0241777
Running ByteArrayFileProcessor... 00:00:09.6087103
Try №20
Running ByteArrayFileProcessor... 00:00:09.5104281
Running SingleByteFileProcessor... 00:00:15.4204477
Running DoubleBufferedFileProcessor... 00:00:08.4340023
Try №21
Running ByteArrayFileProcessor... 00:00:09.1164725
Running DoubleBufferedFileProcessor... 00:00:08.3122338
Running SingleByteFileProcessor... 00:00:15.5167876
Try №22
Running SingleByteFileProcessor... 00:00:15.4644041
Running ByteArrayFileProcessor... 00:00:09.0650666
Running DoubleBufferedFileProcessor... 00:00:08.4652747
Try №23
Running DoubleBufferedFileProcessor... 00:00:07.9826850
Running ByteArrayFileProcessor... 00:00:09.5422714
Running SingleByteFileProcessor... 00:00:15.5279470
Try №24
Running DoubleBufferedFileProcessor... 00:00:08.5136884
Running SingleByteFileProcessor... 00:00:15.4858787
Running ByteArrayFileProcessor... 00:00:09.7949553
Try №25
Running ByteArrayFileProcessor... 00:00:09.7290056
Running SingleByteFileProcessor... 00:00:15.4770333
Running DoubleBufferedFileProcessor... 00:00:09.6178401
 
SingleByteFileProcessor:__________________________00:00:15.4498476
ByteArrayFileProcessor:___________________________00:00:09.4518769
DoubleBufferedFileProcessor:______________________00:00:09.1119822
Для продолжения нажмите клавишу...
Вложения
Тип файла: zip ReadWriteTest.zip (176.6 Кб, 3 просмотров)
2
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
30.09.2018, 17:00  [ТС]
Результат примерно одинаковый, и не всегда в пользу даблбуффера. Реализация на c++ работает гораздо быстрее, это и не удивительно)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
30.09.2018, 17:04
Цитата Сообщение от MakcPletnev Посмотреть сообщение
Реализация на c++ работает гораздо быстрее
Это вы на основании чего утверждаете?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.09.2018, 18:01
Цитата Сообщение от MakcPletnev Посмотреть сообщение
Результат примерно одинаковый
Просто, тестировать надо уметь. Вставьте между тестами задержку в минуту. Это надо для того, чтобы очередь диска очистилась. При запуске без задержки, даже С++-ная реализация сливает.
Цитата Сообщение от Storm23 Посмотреть сообщение
Буферы не переключаются
Переключаются, просто, сначала скопипастил больше чем нужно, а когда редактировал сообщение удалил лишнее. Как вы думаете, я в 5 утра в субботу трезвый был?
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
30.09.2018, 18:16  [ТС]
TopLayer, по первому посту на этой странице
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2018, 18:16

Шифрование потоков большого размера
Здравствуйте, Уважаемые форумчане! Есть огромный по размерам Stream, необходмо его зашифровать. Судя по беглому осмотра криптографии в...

Отправка и прием файла большого размера
Подскажите как узнать окончание приема пакетов файла большого размера. Клиент: if (sock.Connected) { sock.SendFile(p); }Сервер:...

Работа с библиотеками большого размера
Есть большая dll, содержащая большое количество классов, из которых реально нужны будут несколько. При добавлении ее в References будет...

Считывание файла большого размера
Имеется задача, нужно открыть бинарный файл больших размеров, так, чтобы не произошло переполнение оперативной памяти! Подскажите...

Списки большого размера в памяти
Привет. Есть такой код, считываю большой текстовый файл (больше 1Gb), помещаю его в ConcurrentQueue (для дальнейшего параллельного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
67
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru