Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/88: Рейтинг темы: голосов - 88, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 39

Максимально быстрое чтение очень большого файла

24.12.2015, 01:29. Показов 19350. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, задача прочитать очень большой файл (1GB-10GB+).
Нужно провести операцию с каждой строкой этого файла.

Используя StreamReader + ReadLine чтение получается до безобразия долгим.
Может есть способ загрузки файлов в оперативную память и потом быстро посточно его прочитать от туда ? (У меня RAM 32G)
Или ещё какойто способ.
Читал про MemoryMappedFile - в упор не понимаю как оно работает.
Ещё вроде как можно выделить себе память с помощью malloc - тоже не въезжаю как оно там пашет)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2015, 01:29
Ответы с готовыми решениями:

Быстрое чтение большого файла. Зависает процесс
Всем доброго времени суток. Есть задача прочитать файл(1-20 мб), который состоит из слов разделённых пробелами для того, чтобы переписать...

Быстрое чтение большого массива данных с Excel в C++Builder
Всем привет! нужна помощь. Считываю диапазон ячеек с Excel. Например размером 18 на 3500. Код ниже: Variant v_Var_Excel, ...

Быстрое заполнение большого файла
Здравствуйте! Возникла проблема в работе с большим файлом: возникла необходимость быстро заполнять некоторый участок большого файла...

51
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 39
26.12.2015, 18:56  [ТС]
Студворк — интернет-сервис помощи студентам
dan24, Спасибо за статью, нет не брутер) генератор масок по словарям)
0
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 852
26.12.2015, 19:10

Не по теме:

Не то написал



Добавлено через 2 минуты
Цитата Сообщение от LorDo Посмотреть сообщение
if (MaskOut.Count == 0) MaskOut.Add("[MaskAttack]");
Я не пойму эту штуку можно за цикл выкинуть или нет? Вроде бы она нигде не считается и не участвует в цикле.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
26.12.2015, 20:01
Цитата Сообщение от LorDo Посмотреть сообщение
Вот сделал как вы говорили, все верно ?)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            var MaskOut = new List<string>();
 
            var en = (int.Parse(args[4]) == 1) ? Masks.OrderByDescending(r => r.Value).Take(int.Parse(args[1])) : Masks.OrderBy(r => r.Value).Take(int.Parse(args[1]))
 
            if (args[5] == "EGB")
            {
                MaskOut.Add("[MaskAttack]");
                foreach (var item in en)
                    MaskOut.Add(String.Format("{0}={1},{2},{3}", MaskOut.Count, item.Key, item.Key.Length - 1, item.Key.Length));
            }
            else
                foreach (var item in en)
                    MaskOut.Add(item.Key);
Цитата Сообщение от LorDo Посмотреть сообщение
И такой вопрос, ВСЕ это дело в принципе не будет работать на 32-bit или просто будет работать ограничение размера входного файла на 2G ?
Все это дело будет работать на любой платформе и с любым объемом файла (поскольку файл в память все равно полностью не читается).
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.12.2015, 22:40
LorDo, А вообще на будущее совет. Прежде чем оптимизировать, запустите под профайлером код (alt+f2 в студии, если память не изменяет). Она покажет, какие строки долго выполняются, на этим нужно будет подумать. Потому что оптимизировать можно в разных направлениях, оптимизировать во всех - писать много сотен строк кода... Поэтому нужно сначала найти тот минимум из 20% усилий, который даст 80% эффекта.

Storm23, а кто-нибудь замерял производительность string.Format против конкатенации? На 2-3 строках конкатенация точно быстрее, при большем числе параметров форматирующую строку следует использовать хотя бы ради читаемости, а вот про производительность как-то не задумывался...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.12.2015, 01:39
Цитата Сообщение от Psilon Посмотреть сообщение
а кто-нибудь замерял производительность string.Format против конкатенации? На 2-3 строках конкатенация точно быстрее, при большем числе параметров форматирующую строку следует использовать хотя бы ради читаемости, а вот про производительность как-то не задумывался...
Да, я уже запостил, а потом подумал, что конкатенация все таки будет быстрее.
Но тут собственно дело даже не в сложении строк, а в том, что числа преобразуются в строки, что само по себе долго. Я подумал, что в случае string.Format, оно как-то обходит этот момент и не генерирует строки для чисел. Но похоже что это не так, и Format все равно генерирует строки для каждого параметра. Поэтому конкатенация будет быстрее.

С другой стороны, в данном случае это и не очень важно, потому что там перед циклом делается сортировка. А она делается в лучшем случае за O(n log n), а последующий цикл - только O(n), так что сортировка на больших n все равно будет занимать основное время.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.12.2015, 03:26
Storm23, да не, я не про данный случай.

Внутри там идет работа со StringBuilder'ом, соответственно скорость не сильно должна проседать... Хотя при сложении строк идет просто проверка на Null... Нужны тесты.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.12.2015, 13:28
Цитата Сообщение от Psilon Посмотреть сообщение
Внутри там идет работа со StringBuilder'ом, соответственно скорость не сильно должна проседать... Хотя при сложении строк идет просто проверка на Null... Нужны тесты.
Я уже тестировал, конкатенация на 20-50% быстрее.
Да, там StringBuilder, но только вот сама строка форматирования - парсится каждый раз (на поиск {}). Я думал они ее кешируют, но что-то по коду не нашел там кеширования. А значит формат в цикле парсится каждый раз, что снижает производтельность.
0
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
18.08.2016, 23:34
Что бы не плодить тем, пишу тут. Ситуация аналогичная с автором темы, есть файл 30 Гб с текстом (построчный) задача - вытащить (сохранить в другой файл ) строки по заданному критерию, например, если в строке содержится определенное слово.
Имеется желание максимально оптимизировать процесс поиска, т.к. объемы данных большие.
Как я понял, самый оптимальный вариант - это в свободную память ПК нужно подгружать часть файла и уже операции поиска проводить в RAM. Учитывая давние и не глубокие, к сожалению, познания на уровне VB6, я пытаюсь сватья соответствующий код в vb.net, но уже при написании первых строк столкнулся с проблемой - при больших файла возникает ошибка:
Необработанное исключение типа "System.IO.IOException" в System.Core.dll
Дополнительные сведения: Недостаточно памяти для обработки команды.

в строке Using streamreader = New StreamReader(mmf.CreateViewStream)
Теперь вопрос №1 как загружать и обрабатывать часть файла в память при использовании функции MemoryMappedFile
И соответственно вопрос №2 как и в какой момент выгружать данные и памяти и загружать новые для обработки и так до конца файла.
При этом следует понимать, что анализируемый файл имеет размер 30 Гб а памяти на пк 8 Гб, т.е. процесс должен повториться минимум 4-5 раз.
вот фрагмент программы еще даже без обработки строк, а только лишь с функцией подсчета кол-ва строк
VB.NET
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
Imports System.IO
Imports System.IO.MemoryMappedFiles
 
Public Class Form1
    Dim strPathFile As String
    Dim line As String
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim count As Long
        Dim SW As New Stopwatch
 
        Dim ramCounter As New System.Diagnostics.PerformanceCounter("Memory", "Available MBytes")
        MsgBox(ramCounter.NextValue)
 
        Using mmf = MemoryMappedFile.CreateFromFile(strPathFile, FileMode.Open, "ImgA", 0)
            Using streamreader = New StreamReader(mmf.CreateViewStream)
                SW.Start()
                Do While streamreader.Peek >= 0
                    streamreader.ReadLine()
                    count = count + 1
                    If count Mod 1000 = 0 Then Me.Text = count - 1
                Loop
                Me.Text = count - 1
                SW.Stop()
                MsgBox(SW.Elapsed.Seconds & " сек.")
                streamreader.Dispose()
                mmf.Dispose()
            End Using
        End Using
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then strPathFile = OpenFileDialog1.FileName ': Me.Text = strPathFile
    End Sub
End Class
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.08.2016, 23:54
Как бы делал я - копировал бы кусок БАЙТ (не строк, а байт, Всегда одно и то же количество, буфер можно один раз превыделить, например 4КБ), в памяти байты быстренько транслируются в строку, в ней делаем поиск. Т.к. последняя строка наверняка будет обрублена посередине, при загрузке следующего куска предварительно приклеиваем конец предыдущего куска к следующему. Повторяем пока файл не закончится. Это ускорит потому что не нужно будет искать символ конца строки, буфер будет переиспользоваться один и тот же (а это кэш), ну из минусов придется немного руками поделать то, что обычно streamreader внутри прячет.
0
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
18.08.2016, 23:57
а почему бы не сделать буфер 1 Гб ...2...4 и тд? ведь памяти то много свободной.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2016, 01:30
eip, диск все равно читает кусками по 4кб. Смысла грузить гиг памяти нет. Еще и дольше будет - посмотрите спецификацию своего процессора, какой размер кэша 1 уровня.
0
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
19.08.2016, 01:57
Intel Core i7-4770 вроде как 32 кБ для инструкций и 32 кБ для данных на ядро
... эх вот бы еще потоки по ядрам распараллелить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.08.2016, 01:57

Максимальное быстрое создание большого файла
У кого какие алгоритмы создания максимально быстро файлов, больших размеров?

Быстрое чтение из файла
Не подскажите, как быстро считать данные из файла? Вот пример файла: 4 3 qwe 10 sadv 2 sadv 1 blaaaa В первой строке идёт...

Быстрое чтение файла
Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие...

Быстрое чтение массива из файла
Добрый день, появился вроде бы не сложный вопрос, у меня есть динамический массив данных double ** data; // пусть 200x500 //я его...

Быстрое чтение файла xlsx
Создавая программу для парсинга прайс-листов я столкнулся с крайне медленной работой COM Excel. Но благодаря библиотеке EPPlus...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru