Заметки о Windows и других программных продуктах Microsoft...

Альтернативный способ получения содержимого файла

Альтернативный способ получения содержимого файла

Обычно для получения содержимого текстовых файлов в PowerShell используется командлет Get-Content. Например для того, чтобы вывести файл file.txt на экран, надо выполнить такую команду:

Get-Content C:\Files\file.txt

Это наиболее распространенный, но не единственный способ. Получить содержимое файла можно, просто задав в качестве имени переменной путь к файлу. Например такая команда выдаст тот же результат, что и предыдущая:

${C:\Files\file.txt}

Конечно всегда полезно узнать что-то новое, но привел я этот способ вовсе не для общего развития. Дело в том, что при его использовании чтение файла осуществляется гораздо быстрее, при этом потребляя меньше ресурсов. Для наглядности проведем небольшой эксперимент — возьмем файл и считаем его в переменную двумя разными способами, при этом замерив время работы и потребление памяти. Для измерения времени выполнения команды используем командлет Measure-Command.

Сначала замерим исходные данные. Размер файла составляет 65Мб, потребление памяти процессом PowerShell в простое около 66 Мб.

первоначальные параметры

 

Затем считаем содержимое файла в переменную с помощью Get-Content и измерим время работы командой:

Measure-Command -Expression {$a = Get-Content ″C:\Files\file.txt″}

Команда отработала за 5,5 секунд, потребление памяти составило 1079784Кб (≈1Гб).

использование Get-Content

 

Теперь выполним чтение файла альтернативным способом, командой:

Measure-Command -Expression {$a = ${C:\files\file.txt}}

В этом случае для работы команды потребовалось всего 0,3 секунды и 233508Кб (≈233,5Мб) памяти.

использование переменной

 

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

У данного способа есть некоторые особенности. Во первых, путь к файлу не должен быть в кавычках, даже при наличии в нем пробелов. А также в пути к файлу нельзя использовать подстановочные символы или переменные. Например нельзя написать так:

${C:\files\*.txt}

или так:

${%systemdrive%\files\file.txt}

Т.е. этот способ не позволяет считать сразу несколько файлов, в отличие от Get-Content.

 
 
Комментарии

Выполнил у себя манипуляции с файлом размером 40 Мб, результаты одинаковы (в пределах погрешности).

Интересно. Перепроверил на разных ОС, с разным размером файла — разница есть. На больших файлах (150-200Мб) разница в скорости заметна на глаз, даже без измерения.

Всем доброго времени суток, очень понравилась статья.
Былобы классно в будушем читать что-то в этом роде. «Альтернативный способ»

Проверил дома на Win 10, файл размером около 200 МБ, рез-ат впечатляет:
1 с. против 18 и 600 МБ ОЗУ против 1800 МБ в пользу Вашей статьи. Видимо, в прошлый раз файл был маленького размера либо в Win7 как-то по-другому отрабатывает.

Get-Content C:\Files\file.txt -ReadCount 0
делает то же самое.

Да, провел тесты на 600 метровом файле. Итого
просто Get-Content — 31 секунда.
Get-Content с параметром ReadCount 0 — 12 секунд
${%filepath%} — 9 секунд

при повторном тесте 2 и 3-го способов они показывали одинаковый вариант.

Socksuccer

Животное

Leave a Reply to Kirill