[Gvsig_desarrolladores] Re: Exception Too many open files...

Francisco José Peñarrubia fpenarru en gmail.com
Vie Abr 24 09:04:02 CEST 2009


Hola Nacho.

Hay un fallo muy viejo (desde la primera versión) que no nos hemos 
preocupado de mirar todavía que puede que esté relacionado con eso. 
Cuando abres un fichero en gvSIG, ArcGIS se queja de que ese fichero 
está en uso. Me parece que solo nos pasaba con ArcGIS,  pero no estoy 
seguro. El fallo estaba localizado en el driver de dbf, que se basa en 
código de una versión vieja de Geotools. Yo revisaría el código de la clase
com.iver.gvsig.fmap.drivers.shp.DbaseFileNIO.java, en el método close().
Prueba cosas como cambiar el orden:

        fin.close();
        channel.close(); => Cerrar primero el channel y luego fin

O algo más elaborado como esto:

    if (channel.isOpen()) {
      channel.close();
    }
    if (buffer instanceof MappedByteBuffer) {
      NIOUtilities.clean(buffer);
    }
    buffer = null;
    channel = null;
    charBuffer = null;
    decoder = null;
    header = null;
    row = null;


La clase NIOUtilities la puedes ver aquí (es de Geotools):
http://www.koders.com/java/fid2156FC532DCDCD0956AB68E67CF59FE937FD32CB.aspx?s=mdef%3Ainsert
pero creo que el buffer no es un MappedByteBuffer, así que no sé si 
realmente sirve para algo.

El problema también podría venir por los shx o shp, o incluso los 
Writers, y entonces tendrías que depurar IndexedShapeFile, en el método 
close(), y comprobar que todo se cierra bien.
Si te animas con esto, aisla primero el problema, y asegurate primero de 
que el problema está en el dbf (edita solo una tabla, no un shapefile) y 
no en el shx o shp.

Suerte, y si lo arreglas, habrás solucionado uno de los más difíciles 
(en mi opinión).

Saludos.

Fran.


Nacho Uve escribió:
> Seguimos teniendo muchísmos problemas a causa de exception provocada 
> por el error [1] que dice que hay demasiados ficheros abiertos. 
> Tenemos la sospecha de que es provocado por que getRecordset() deja 
> abiertos los ficheros y no hay manera de que los cierre (incluso 
> aunque se cargue un nuevo proyecto gvp).
>
> ¿Hay alguna forma de cerrar dichos ficheros?  Si no es así... ¿qué 
> pasos habría que seguir para modificar las clases implicadas?
>
> Un saludo,
> Nacho
>
>  
>
> [1]: com.iver.cit.gvsig.fmap.drivers.DriverIOException: 
> java.io.FileNotFoundException: /var/tmp/micapa.shp (Too many open 
> files) at 
> com.iver.cit.gvsig.fmap.layers.FLyrVect.reload(FLyrVect.java:1313)
>
> --
> Juan Ignacio Varela García (Nacho Uve)
> Coordinador Grupo de Desarrollo
> Cartolab - Laboratorio de Ingeniería Cartográfica
> http://www.cartolab.es
>
> ETS Ingeniería de Caminos, Canales y Puertos
> Universidade da Coruña
> Campus de Elviña - 15071 A Coruña (España)
> (34)981167000 ext. 5493
>
>
>
> El 3 de abril de 2009 14:00, Nacho Uve <nachouve en gmail.com 
> <mailto:nachouve en gmail.com>> escribió:
>
>     Hola,
>
>     Estamos creando una extension para gvSIG 1.2 que hace muchos
>     getRecordset() sobre una misma capa vectorial (por ejemplo,  en la
>     función isEnabled() para extender la clase Extension).
>     Llega un momento que lanza una serie de exceptions [1]. ¿Puede ser
>     que cada vez que se hace getRecordset quede un archivo abierto?
>     ¿Hay algún modo de cerrarlos?
>
>     Un saludo,
>     Nacho
>
>
>
>
>     [1]: com.iver.cit.gvsig.fmap.drivers.DriverIOException:
>     java.io.FileNotFoundException: /var/tmp/micapa.shp (Too many open
>     files)
>         at
>     com.iver.cit.gvsig.fmap.layers.FLyrVect.reload(FLyrVect.java:1313)
>         at
>     es.udc.cartolab.gvsig.navtable.AbstractNavTable.refreshGUI(AbstractNavTable.java:421)
>         at
>     es.udc.cartolab.gvsig.navtable.AbstractNavTable.actionPerformed(AbstractNavTable.java:530)
>         at
>     es.udc.cartolab.gvsig.navforms.TramosForm.actionPerformed(TramosForm.java:684)
>         at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1197)
>         at javax.swing.JComboBox.setSelectedItem(JComboBox.java:561)
>         at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:597)
>         at
>     es.udc.cartolab.gvsig.navforms.TramosForm.fillValues(TramosForm.java:387)
>         at
>     es.udc.cartolab.gvsig.navtable.AbstractNavTable.next(AbstractNavTable.java:224)
>         at
>     es.udc.cartolab.gvsig.navtable.AbstractNavTable.actionPerformed(AbstractNavTable.java:491)
>         at
>     es.udc.cartolab.gvsig.navforms.TramosForm.actionPerformed(TramosForm.java:684)
>         at
>     javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
>         at
>     javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
>         at
>     javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
>         at
>     javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
>         at
>     javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
>         at
>     java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231)
>         at java.awt.Component.processMouseEvent(Component.java:5517)
>         at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
>         at java.awt.Component.processEvent(Component.java:5282)
>         at java.awt.Container.processEvent(Container.java:1966)
>         at java.awt.Component.dispatchEventImpl(Component.java:3984)
>         at java.awt.Container.dispatchEventImpl(Container.java:2024)
>         at java.awt.Component.dispatchEvent(Component.java:3819)
>         at
>     java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
>         at
>     java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
>         at
>     java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
>         at java.awt.Container.dispatchEventImpl(Container.java:2010)
>         at java.awt.Window.dispatchEventImpl(Window.java:1791)
>         at java.awt.Component.dispatchEvent(Component.java:3819)
>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
>         at
>     com.iver.andami.ui.AndamiEventQueue.dispatchEvent(AndamiEventQueue.java:58)
>         at
>     java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
>         at
>     java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
>         at
>     java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
>         at
>     java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
>         at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
>     Caused by: java.io.FileNotFoundException: /var/tmp/micapa.shp (Too
>     many open files)
>         at java.io.FileInputStream.open(Native Method)
>         at java.io.FileInputStream.<init>(FileInputStream.java:106)
>         at
>     com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver.open(IndexedShpDriver.java:148)
>         at
>     com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver.reload(IndexedShpDriver.java:868)
>         at
>     com.iver.cit.gvsig.fmap.layers.FLyrVect.reload(FLyrVect.java:1296)
>         ... 36 more
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>   



Más información sobre la lista de distribución gvSIG_desarrolladores