Get-contenido y medir a objetos están muy bien para archivos pequeños, pero ambos son muy ineficientes con la memoria que tenía verdaderos problemas con archivos de gran tamaño
Cuando.. contando filas en un archivo de 1GB usando cualquiera de los dos métodos, Powershell engulló toda la memoria disponible en el servidor (8GB) y luego comenzó a buscar en el disco. Lo dejé más de una hora, pero todavía estaba buscando en el disco, así que lo maté.
El mejor método que encontré para archivos grandes es usar IO.StreamReader para cargar el archivo desde el disco y contar cada fila usando una variable. Esto reduce el uso de la memoria a 25 MB muy razonables y es mucho, mucho más rápido, tomar alrededor de 30 segundos para contar filas en un archivo de 1 GB o un par de minutos para un archivo de 6 GB. Nunca se come cantidades irrazonables de RAM, no importa cuán grande es su archivo es:
[int]$LinesInFile = 0
$reader = New-Object IO.StreamReader 'c:\filename.csv'
while($reader.ReadLine() -ne $null){ $LinesInFile++ }
El fragmento anterior se puede insertar cualquier lugar que utilizaría conseguir-contenido o medida a objetos, simplemente se refieren a la variable $ LinesInFile a obtener el recuento de filas del archivo.
Gracias, esto parece funcionar, pero es terriblemente lento en comparación, por ejemplo, a GNU Unix utiliza wc.exe. – jrara
Eso es porque wc.exe sería el equivalente a (Get-Content) .Length que, si bien es mucho más rápido que Import-CSV, también es una solución potencialmente incorrecta como lo señala stej, ya que no daría cuenta de las filas con campos multilínea. – EBGreen
cosas geniales. Justo lo que necesitaba... –