elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  System.OutOfMemoryException
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: System.OutOfMemoryException  (Leído 3,912 veces)
Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
System.OutOfMemoryException
« en: 21 Diciembre 2017, 20:04 pm »

Buenas tardes,

Me colaboraron con un PowerShell que lee un archivo CSV y transfiere a otro archivo CSV las columnas que yo elija, hasta aquí todo bien, funciona con archivos pequeños y de pocos registros, sin embargo estoy intentando cargar un archivo que pesa cerca de 1.5 Gb y según

Get-Content miarchivo.csv | Measure-Object

Count    : 2563236


La cuestion es que según yo al cargar el archivo se queda sin memoria, se recibe el error: "Import-Csv : Exception of type 'System.OutOfMemoryException' was thrown"

algo para superar este inconveniente?


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #1 en: 21 Diciembre 2017, 21:49 pm »

algo para superar este inconveniente?

Prueba con las clases de .NET Framework (esto tecnicamente ya no sería puto código PowerShell):

script.ps1
Código
  1. $lines = [System.IO.File]::ReadLines( "C:\File.csv", [System.Text.Encoding]::Default )
  2. [System.Int32] $count = ($lines).Count
  3.  
  4. Write-Host $count

No estoy muy seguro de si funcionará. Por un lado la clase IEnumerable (la cual es parecida a un Array en la programación) es un tipo de evaluación vaga (Lazy Evaluarion Type), esto quiere decir que las lineas del contenido del archivo.csv (o dicho de otra forma, los elementos del Array) solo se cargarán en memoria a medida que vaya siendo realmente necesario y se deasignará de la memoria cuando ya no sea necesario, por lo que en principio no sufririas un desbordamiento de memoria, sin embargo al usar la propiedad IEnumerable.Count tiene que iterar todos los elementos de la colección IEnumerable para hacer el conteo... así que no estoy seguro de lo que sucederá, pruébalo y me dices.

Saludos.


« Última modificación: 21 Diciembre 2017, 22:25 pm por Eleкtro » En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #2 en: 21 Diciembre 2017, 22:09 pm »

Method invocation failed because [System.IO.File] doesn't contain a method named 'ReadLines'.

At line:2 char:37

Lo estoy haciendo sobre el PowerShell, es correcto?
« Última modificación: 21 Diciembre 2017, 22:27 pm por Pisangas » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #3 en: 21 Diciembre 2017, 22:31 pm »

Lo estoy haciendo sobre el PowerShell, es correcto?

si.



por el momento me dice Method invocation failed because [System.IO.File] doesn't contain a method named 'ReadLines'.

Sin embargo validando la clase ReadLines si pertenece al objeto System.IO.File

La función System.IO.File.ReadLines() fue introducida en la versión 4.0 de .NET Framework, así que necesitas tener instalada esa versión (como mínimo) o una superior en tu Windows. Si eso no es posible, entonces mo podrás usar ese código. Puedes probar con la función "ReadAllLines" en vez de "ReadLines" (solo tienes que cambiarle el nombre a esa parte del código), pero el resultado me temo que será muy distinto ( ya que esa función devuelve un Array como tal, así que probablemente se te desbordará la memoria, pero bueno, por probar... puedes intentarlo a ver. )

Saludos
« Última modificación: 21 Diciembre 2017, 22:38 pm por Eleкtro » En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #4 en: 21 Diciembre 2017, 22:42 pm »

Actualizo el .NET y te aviso cualquier cosa, gracias!
En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #5 en: 21 Diciembre 2017, 23:00 pm »

tengo la versión 4.7

si.



La función System.IO.File.ReadLines() fue introducida en la versión 4.0 de .NET Framework, así que necesitas tener instalada esa versión (como mínimo) o una superior en tu Windows. Si eso no es posible, entonces mo podrás usar ese código. Puedes probar con la función "ReadAllLines" en vez de "ReadLines" (solo tienes que cambiarle el nombre a esa parte del código), pero el resultado me temo que será muy distinto ( ya que esa función devuelve un Array como tal, así que probablemente se te desbordará la memoria, pero bueno, por probar... puedes intentarlo a ver. )

Saludos
En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #6 en: 21 Diciembre 2017, 23:03 pm »

Me temo que ocurre igual


Exception calling "ReadAllLines" with "1" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown."
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #7 en: 21 Diciembre 2017, 23:54 pm »

Me temo que ocurre igual


Exception calling "ReadAllLines" with "1" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown."

Eso te dije, que probablemente te ocurriría igual con "ReadAllLines". Prueba con "ReadLines", si tienes .NET Framework 4.7 deberías poder usar esa función, si te sale algún error, muestra el mensaje de error.

saludos
En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #8 en: 22 Diciembre 2017, 16:52 pm »

No se, responde igual


Method invocation failed because [System.IO.File] doesn't contain a method named 'ReadLines'.
At line:1 char:37
+ $lines = [System.IO.File]::ReadLines <<<< ( "C:\xxxx.csv", [System.Text.Encoding]::Default )
    + CategoryInfo          : InvalidOperation: (ReadLines:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound


y cuando lo cambio por la clase ReadAllLines arroja excepcion de memoria al cargar el csv

Exception calling "ReadAllLines" with "2" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown."
At line:1 char:40

existe alguna manera de configurar en algún lugar un valor de memoria mas alto?

[MOD] usar "modificar" para añadir comentarios, no hacer doble post.
« Última modificación: 22 Diciembre 2017, 17:36 pm por simorg » En línea

Pisangas

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: System.OutOfMemoryException
« Respuesta #9 en: 22 Diciembre 2017, 17:52 pm »

Bueno creo que de tanto buscar e intentar encontré la solución.

Como lo entendi, no era necesario esperar la importacion, luego la seleccion de las columnas para al final exportar, entonces por que no hacerlo todo al mismo tiempo


$csv = Import-Csv -Path "C:\xxx\xxx.csv" -Delimiter "|" | select "DATO1","DATO2","DATOn" | export-CSV C:\xxx\xxx.csv

tal vez sea una "chambonada"pero me funciono. Mil gracias por todo el apoyo.
« Última modificación: 22 Diciembre 2017, 18:08 pm por Pisangas » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
copiar a system o system 32 « 1 2 3 4 »
Programación Visual Basic
vivachapas 31 12,207 Último mensaje 25 Mayo 2007, 19:06 pm
por vivachapas
Alternatica a conio.h y system("cls"); y system("clear"); ?
Programación C/C++
flacc 5 9,227 Último mensaje 17 Diciembre 2010, 16:55 pm
por flacc
System 32
Windows
DanFire 2 1,884 Último mensaje 11 Septiembre 2012, 19:07 pm
por DanFire
System.Xml.Linq y System.Core « 1 2 »
.NET (C#, VB.NET, ASP)
SγиtαxEяяoя 10 7,130 Último mensaje 23 Junio 2013, 23:50 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines