Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Optimizar lectura de un archivo de texto

Estas en el tema de Optimizar lectura de un archivo de texto en el foro de Java en Foros del Web. Saludos! Tengo un problema con un archivo de texto. Siempre había utilizado la clase BufferedReader para leer el contenido de algún InputStream de un Fichero. ...
  #1 (permalink)  
Antiguo 28/03/2016, 17:31
 
Fecha de Ingreso: febrero-2015
Ubicación: Distrito Federal
Mensajes: 38
Antigüedad: 9 años, 9 meses
Puntos: 1
Optimizar lectura de un archivo de texto

Saludos!
Tengo un problema con un archivo de texto.
Siempre había utilizado la clase BufferedReader para leer el contenido de algún InputStream de un Fichero.

El problema es que este archivo de texto tiene más de 2 millones de líneas lo que hace que la lectura del mismo con el InputStreamReader y BufferedReader ya no sea tan rápida como yo lo imaginaba.

¿Habrá alguna forma de optimizar este proceso?, ya que cada línea del archivo tiene un número telefónico que una vez que se obtiene se inserta en una base de datos.
  #2 (permalink)  
Antiguo 28/03/2016, 17:59
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: Optimizar lectura de un archivo de texto

En java leer y escribir de disco siempre es lento, lo que puedes hacer es aumentar la memoria de la maquina virtual para que la busqueda de secciones de memoria libres a la hora de leer sea mas rapida, pero no se notara mucho. Tambien podrias limitar el tamaño del archivo para obligar al usuario a seccionarlo y que suba varios archivos mas chicos. O este proceso podrias hacerlo tu mismo seccionado el archivo en partes y despues usar hilos para procesar cada parte. Otra opcion sería combinar las opciones anteriores. Una ultima opcion descabellada es que programes esa parte en scala o en kotlin y la conectes con tu codigo java para ver si es mas rapido.
Aunque algo mas sensato sería programar esta parte en c o c++ ya que son mas rapidos, y se me acab de ocurrir usar esto con jni, bueno creo que hay demasiadas opciones.
  #3 (permalink)  
Antiguo 29/03/2016, 02:51
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Optimizar lectura de un archivo de texto

Cita:
En java leer y escribir de disco siempre es lento
No veo por que.

La implemetacion para hacer operationes IO de la JVM esta hecha en codigo nativo compilado y optimizado, por lo que el rendimiento es igual o incluso mas rapido que en un programa en C standard.

La forma mas optima para leer el fichero con el menor 'overhead' seria, bien utilizar la API java NIO (https://docs.oracle.com/javase/tutor...l/io/file.html) o simplemente leer los bytes por trozos (chunks):

Código Java:
Ver original
  1. InputStream is = ...;
  2. OutputStream os = ...;
  3.  
  4. byte buffer[] = new byte[1024];
  5. int read;
  6. while((read = is.read(buffer)) != -1){
  7.     os.write(buffer, 0, read);
  8. }

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 29/03/2016, 11:54
 
Fecha de Ingreso: febrero-2015
Ubicación: Distrito Federal
Mensajes: 38
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Optimizar lectura de un archivo de texto

Hice lo que mencionó el Profesor_Falken y el tiempo tiempo se redujo de 10 min a 2 min.
Posteriormente llegué a otra solución en donde en lugar de insertar en base de datos generaba un archivo nuevo ya con todos los datos que necesitaba.

Gracias!
  #5 (permalink)  
Antiguo 29/03/2016, 12:01
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: Optimizar lectura de un archivo de texto

Bueno una traduccion de nativo a jvm siempre tiene un costo, Ej:
Java vs C http://benchmarksgame.alioth.debian.org/u64q/java.html
Java vs C++ http://benchmarksgame.alioth.debian....java&lang2=gpp
  #6 (permalink)  
Antiguo 30/03/2016, 01:08
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Optimizar lectura de un archivo de texto

Buenas,

Si, pero esos son benchmarks de algoritmos, no de operaciones I/O.
Esta claro que para algoritmos java nunca podra ser mas rapido que el codigo nativo, aunque en algunos casos la magia del compidador JIT permita acercarse o igualar la velocidad (si te fijas, hay algunos de los benchmarks que has puesto en los que Java es incluso mas rapido que GCC).

En las operationes I/O los bloqueos se producen normalmente a bajo nivel y dependen de la implementacion nativa que proporciona el sistema operativo y del canal sobre el que operan.
Por ejemplo, aqui tienes la implementacion de Java NIO para Windows en la JVM hotspot:
http://hg.openjdk.java.net/nio/nio/h...os_windows.cpp
Como veras al final todo se reduce a la utilizacion de la funcion ReadFile de la WinAPI: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
(Hay que notar que al tratarse de codigo nativo incluido en la JVM no existe la sobrecarga que se produciria si usamos interfaces nativas -JNI-, por ejemplo)

Algo parecido sucede si nos conectamos a una base de datos o a un recurso remoto. Lo que nos bloquea no es el lenguaje utilizado, sino las interfaces de comunicacion sobre las que nos apoyamos.

Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 30/03/2016 a las 01:13

Etiquetas: fichero, optimización
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:38.