|
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 39
|
|
Максимально быстрое чтение очень большого файла24.12.2015, 01:29. Показов 19350. Ответов 51
Метки нет (Все метки)
Добрый день, задача прочитать очень большой файл (1GB-10GB+).
Нужно провести операцию с каждой строкой этого файла. Используя StreamReader + ReadLine чтение получается до безобразия долгим. Может есть способ загрузки файлов в оперативную память и потом быстро посточно его прочитать от туда ? (У меня RAM 32G) Или ещё какойто способ. Читал про MemoryMappedFile - в упор не понимаю как оно работает. Ещё вроде как можно выделить себе память с помощью malloc - тоже не въезжаю как оно там пашет)
0
|
|
| 24.12.2015, 01:29 | |
|
Ответы с готовыми решениями:
51
Быстрое чтение большого файла. Зависает процесс Быстрое чтение большого массива данных с Excel в C++Builder
|
|
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 39
|
|
| 26.12.2015, 18:56 [ТС] | |
|
0
|
|
|
168 / 107 / 30
Регистрация: 19.01.2013
Сообщений: 852
|
||
| 26.12.2015, 19:10 | ||
|
Не по теме: Не то написал Добавлено через 2 минуты
0
|
||
|
|
||||||||
| 26.12.2015, 20:01 | ||||||||
1
|
||||||||
|
Master of Orion
|
|
| 26.12.2015, 22:40 | |
|
LorDo, А вообще на будущее совет. Прежде чем оптимизировать, запустите под профайлером код (alt+f2 в студии, если память не изменяет). Она покажет, какие строки долго выполняются, на этим нужно будет подумать. Потому что оптимизировать можно в разных направлениях, оптимизировать во всех - писать много сотен строк кода... Поэтому нужно сначала найти тот минимум из 20% усилий, который даст 80% эффекта.
Storm23, а кто-нибудь замерял производительность string.Format против конкатенации? На 2-3 строках конкатенация точно быстрее, при большем числе параметров форматирующую строку следует использовать хотя бы ради читаемости, а вот про производительность как-то не задумывался...
0
|
|
|
|
||
| 27.12.2015, 01:39 | ||
|
Но тут собственно дело даже не в сложении строк, а в том, что числа преобразуются в строки, что само по себе долго. Я подумал, что в случае string.Format, оно как-то обходит этот момент и не генерирует строки для чисел. Но похоже что это не так, и Format все равно генерирует строки для каждого параметра. Поэтому конкатенация будет быстрее. С другой стороны, в данном случае это и не очень важно, потому что там перед циклом делается сортировка. А она делается в лучшем случае за O(n log n), а последующий цикл - только O(n), так что сортировка на больших n все равно будет занимать основное время.
0
|
||
|
Master of Orion
|
|
| 27.12.2015, 03:26 | |
|
Storm23, да не, я не про данный случай.
Внутри там идет работа со StringBuilder'ом, соответственно скорость не сильно должна проседать... Хотя при сложении строк идет просто проверка на Null... Нужны тесты.
0
|
|
|
|
||
| 27.12.2015, 13:28 | ||
|
Да, там 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 раз. вот фрагмент программы еще даже без обработки строк, а только лишь с функцией подсчета кол-ва строк
0
|
||||||
|
Master of Orion
|
|
| 18.08.2016, 23:54 | |
|
Как бы делал я - копировал бы кусок БАЙТ (не строк, а байт, Всегда одно и то же количество, буфер можно один раз превыделить, например 4КБ), в памяти байты быстренько транслируются в строку, в ней делаем поиск. Т.к. последняя строка наверняка будет обрублена посередине, при загрузке следующего куска предварительно приклеиваем конец предыдущего куска к следующему. Повторяем пока файл не закончится. Это ускорит потому что не нужно будет искать символ конца строки, буфер будет переиспользоваться один и тот же (а это кэш), ну из минусов придется немного руками поделать то, что обычно streamreader внутри прячет.
0
|
|
|
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
|
|
| 18.08.2016, 23:57 | |
|
а почему бы не сделать буфер 1 Гб ...2...4 и тд? ведь памяти то много свободной.
0
|
|
|
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
|
|
| 19.08.2016, 01:57 | |
|
Intel Core i7-4770 вроде как 32 кБ для инструкций и 32 кБ для данных на ядро
... эх вот бы еще потоки по ядрам распараллелить
0
|
|
| 19.08.2016, 01:57 | |
|
Быстрое чтение из файла
Быстрое чтение массива из файла Быстрое чтение файла xlsx Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Копировать 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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|