Многие из нас сталкивались с задачей обработки гигантских выгрузок данных. Представьте ситуацию: у вас есть текстовый или CSV файл объемом 4 гигабайта, в котором, предположительно, содержатся десятки миллионов строк. Нам нужно просто узнать их точное количество. Мы по привычке открываем обычный Notepad++, пытаемся загрузить файл в Word или просмотреть стандартными средствами Windows, но сталкиваемся с зависаниями, ошибками нехватки оперативной памяти или откровенно неверными результатами (например, программа показывает 300 000 строк вместо реальных 88 миллионов).
Давайте разберем эту проблему подробно и рассмотрим эффективные способы ее решения. Выясним причину падений программ: стандартные редакторы пытаются загрузить весь объем файла в оперативную память (RAM). Если файл весит 4 ГБ, в распакованном виде внутри программы он может потребовать 8-12 ГБ памяти. Если памяти не хватает, программа падает. Следовательно, нам нужны методы потокового чтения, при которых данные считываются и обрабатываются последовательно, небольшими порциями или построчно.
Если мы работаем в экосистеме 1С, у нас есть отличные встроенные механизмы. Важно понимать разницу между объектами платформы. Многие программисты по ошибке пытаются использовать объект ТекстовыйДокумент. Однако этот объект загружает весь файл в память целиком, что неминуемо приведет к зависанию. Для нашей задачи мы применим объект ЧтениеТекста, который реализует именно потоковое чтение.
Рассмотрим по шагам, как написать простой и эффективный код для подсчета строк. Вы можете выполнить этот код в любой консоли выполнения кода 1С или добавить в простую обработку:
ИмяФайла = "C:\ПутьКФайлу\ВашФайл.csv";
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
Сч = 0;
Пока ЧтениеТекста.ПрочитатьСтроку() <> Неопределено Цикл
Сч = Сч + 1;
КонецЦикла;
ЧтениеТекста.Закрыть();
Сообщить("Количество строк: " + Сч);
Проанализируем этот код: метод ПрочитатьСтроку() берет из файла только одну строку за раз, мы увеличиваем счетчик и сразу же "забываем" содержимое прочитанной строки, освобождая память. На практике такой скрипт обрабатывает файл размером 4 ГБ (около 86,5 миллионов строк) примерно за 5 минут, практически не нагружая оперативную память.
Если под рукой нет 1С, мы можем воспользоваться встроенными средствами Windows, а именно PowerShell. Однако здесь есть коварная ловушка, в которую часто попадают разработчики.
Посмотрим на неправильный пример кода, который часто можно встретить на просторах сети:
$filePath = "C:\ПутьКФайлу\ВашФайл.csv"
$fileContent = Get-Content -Path $filePath
$lineCount = ($fileContent | Measure-Object -Line).Lines
Write-Host "Количество строк: $lineCount"
Почему этот код "повесит" ваш компьютер при файле в 4 ГБ? Командлет Get-Content по умолчанию считывает весь файл и создает отдельный объект .NET для каждой строки в оперативной памяти. Это катастрофически медленно и ресурсозатратно.
Давайте перепишем скрипт, используя потоковое чтение через классы .NET. Разберем правильный вариант с использованием объекта IO.StreamReader:
$LinesInFile = 0
$reader = New-Object IO.StreamReader "C:\ПутьКФайлу\ВашФайл.csv"
while($reader.ReadLine() -ne $null){
$LinesInFile++
}
$reader.Close()
Write-Host "Всего строк: $LinesInfile"
Или рассмотрим еще более элегантный и лаконичный метод, который работает как генератор и не перегружает память:
$count = [System.IO.File]::ReadLines("C:\ПутьКФайлу\ВашФайл.csv").Count
Write-Host "Всего строк: $count"
Если вы не хотите писать скрипты и предпочитаете старую добрую командную строку Windows (CMD), мы можем применить хитрость с утилитой find. Мы заставим утилиту искать строки, которые НЕ содержат пустых значений (инверсия поиска).
Посмотрим на пример команды:
type C:\Путь\ВашФайл.csv | find /v /c ""
Либо можно выполнить поиск набора символов, которого гарантированно нет в вашем файле:
find /c /v "несуществующий_набор_абвгд" C:\Путь\ВашФайл.csv
Этот способ работает медленнее, чем специально написанные скрипты или Linux-утилиты, но он всегда доступен "из коробки" в любой версии Windows.
Самым быстрым, проверенным и надежным способом подсчета строк в IT-мире признана консольная утилита wc (сокращение от Word Count) из систем Linux/Unix. Она написана на языке C и оптимизирована на низком уровне. Файл на несколько гигабайт она просчитает буквально за считанные секунды.
Как нам использовать это в Windows? У нас есть несколько путей:
Команда для подсчета строк выглядит предельно просто. Мы используем ключ -l (от слова line):
wc -l ВашФайл.csv
Что делать, если нам нужно не только узнать количество строк, но и визуально просмотреть данные, найти определенные значения и убедиться в корректности структуры огромного CSV файла? Обычные блокноты здесь бессильны.
В этом случае нам на помощь приходит специализированное программное обеспечение. Безоговорочным лидером в среде Windows является редактор EmEditor. Разберем его преимущества: программа специально оптимизирована для работы с гигантскими текстовыми массивами и таблицами CSV. Она поддерживает открытие файлов размером до 248 ГБ! Программа не загружает файл в память целиком, она мгновенно открывает первые экраны текста и практически моментально подсчитывает общее количество строк в статус-баре.
Также вы можете обратить внимание на бесплатные альтернативы для просмотра больших файлов (хотя они могут уступать в скорости поиска и редактирования):
Если вы дата-инженер и регулярно сталкиваетесь с файлами по 50-100 ГБ, даже потоковое чтение может занять много времени. Для максимальной скорости энтузиасты применяют утилиты, использующие технологию проецирования файла в память (memory mapping).
Проанализируем, как это работает: вместо того чтобы читать файл строка за строкой, программа логически делит массив данных на равные блоки и заставляет все доступные ядра процессора (многопоточность) параллельно искать символы переноса строки (обычно это символ \n). Утилиты вроде turbo-linecount позволяют подсчитать сотни миллионов строк в многогигабайтных базах данных за доли секунды, максимально утилизируя мощность современных NVMe-дисков и многоядерных процессоров.
Мы подробно разобрали различные способы работы с файлами огромного размера. Подведем краткий итог, чтобы вам было проще выбрать оптимальный инструмент:
ЧтениеТекста в 1С. Это надежно и просто.System.IO.File в PowerShell.wc -l через Git Bash или WSL.Помните главное правило при работе с Big Data: никогда не пытайтесь загрузить весь объем данных в оперативную память. Всегда используйте инструменты потоковой обработки!