Error de memoria al escribir datos en cola grandes en el archivo

No estoy seguro de cómo lidiar específicamente con esto (nuevo en Java). Básicamente tengo un programa que genera muchos datos que están más allá de mi memoria (por ejemplo, sus datos de 10 gigas y tengo 4 gigas de ram). Decidí bifurcar un hilo que toma los datos y los escribe en el disco, aunque sé que las escrituras en disco nunca podrían seguir el proceso que lo genera, esperaba que mi aplicación pueda estar vinculada a la rapidez con la que puedo escribir en el disco. Pero después de un tiempo me sale un montón de errores de memoria.

Aquí hay partes que creo que son relevantes: todos los datos que deben escribirse se colocan en esta variable:

private static Queue<short[]> result =  new LinkedList <short[]> ();

Aquí está la parte que guarda en el archivo:

   static class SaveToFile extends Thread {


        public void run() {
                FileWriter bw = null;
                try {
                    bw = new FileWriter("output.csv");
                    Thread.sleep(500); //delay the start so the queue can have some data
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            System.out.println("size of results during execution is " + result.size());
            while(!result.isEmpty()) {
                short[] current = result.poll();
                try {
                    bw.write(Arrays.toString(current) + "," + "\n");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            try {
                bw.flush();
                bw.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("file writing is done");
        }
    }

No estoy seguro de lo que estoy haciendo mal, ¿debo bloquear la cola de resultados en un tamaño determinado para que mi proceso deje de escribir en ella? o estoy haciendo algo mal con la escritura en el archivo, estoy mostrando la versión no almacenada pero he intentado bufferedWriter con el mismo resultado? He observado que mientras el programa se está ejecutando, el tamaño del archivo es 0, solo una vez que se bloquea parece escribir ... ¿está reteniendo esto en la memoria incluso sin BufferedWriter y podría estar causando el problema de memoria?

Mi idea era que a medida que el hilo SaveToFile despeja la cola, deja más espacio para que el otro proceso continúe escribiéndole (estos son los únicos hilos que estoy ejecutando, el programa principal y SaveToFile).

Respuesta 1

Tecnologías utilizadas: Java 1.6 SWT GUI Problema: las actualizaciones de información de la GUI finalmente se bloquean (la GUI deja de responder por completo) después de aproximadamente 60 minutos de ejecución de una tarea en segundo plano. El problema ...

Posible duplicado: ¿recuperar la configuración regional del navegador de httpsession? ¿Cómo podemos obtener el formato de fecha utilizado por el sistema cliente en una aplicación web? ¿Puedo usar javascript o se puede hacer algo con el código java?

Estoy tratando de incorporar Java KeyListener a mi objeto en movimiento con las flechas izquierda / derecha que afectan las coordenadas del eje x (xSpeed) y las flechas arriba / abajo que afectan el eje y (ySpeed). Simplemente no estoy ...

Utilizando aplicaciones web Java (JSP / Servlets, sin EJB), ¿cuál es el mejor enfoque para autenticar a un usuario y autorizar sus acciones, sin utilizar HttpSession? NB La razón de esto ...