2011-08-08 8 views
6

Tengo algunos archivos grandes y grandes con los que trabajo y uso varias funciones de E/S diferentes para acceder a ellos. El más común es el paquete bigmemory.Comprobando si se han barrido buffers en R

Cuando escribo en los archivos, he aprendido de la manera difícil de vaciar los búferes de salida, de lo contrario, todas las apuestas están apagadas sobre si los datos se guardaron. Sin embargo, esto puede llevar a tiempos de espera muy largos, mientras que bigmemory hace su trabajo (muchos minutos). No sé por qué sucede esto, no siempre ocurre y no se reproduce fácilmente.

¿Hay alguna forma de determinar si los búfers de E/S se han purgado en R, especialmente para bigmemory? Si el sistema operativo es importante, no dude en restringir la respuesta de esa manera.

Si una respuesta se puede generalizar más allá de bigmemory, sería genial, ya que a veces confío en otras funciones de asignación de memoria o flujos de E/S.

Si no hay buenas soluciones para comprobar si los búferes se han limpiado, ¿hay casos en los que se puede suponer que se han limpiado buffers? Es decir. además de usar flush().

Actualización: Debo aclarar que todas estas son conexiones binarias. @RichieCotton notó que isIncomplete(), aunque la documentación de ayuda solo menciona las conexiones de texto. No está claro si eso se puede usar para conexiones binarias.

+0

No estoy seguro sobre el uso con 'bigmemory', pero' isIncomplete' funciona para conexiones regulares. –

+0

¡Gracias! La información de ayuda muy limitada sobre las conexiones solo menciona que isIncomplete es adecuado para la salida de las conexiones de texto. ¿Has tenido suerte con las conexiones binarias? – Iterator

Respuesta

0

Voy a poner adelante mi propia respuesta, pero la bienvenida a cualquier cosa que sea más clara.

Según lo que he visto hasta ahora, las diversas funciones de conexión, p. file, open, close, flush, isOpen y isIncomplete (entre otros), se basan en tipos de conexión específicos, p. archivos, pipas, URL y algunas otras cosas.

Por el contrario, bigmemory tiene su propio tipo de conexión y el objeto bigmemory es un objeto S4 con una ranura para una dirección de memoria para los búferes del sistema operativo. Una vez colocado allí, el SO se encarga de enjuagar esos buffers. Dado que es una responsabilidad del sistema operativo, obtener información sobre almacenamientos intermedios "sucios" requiere interactuar con el sistema operativo, no con R.

Por lo tanto, la respuesta para bigmemory es "no" ya que los datos se almacenan en el almacenamiento intermedio del kernel, aunque puede ser "sí" para otras conexiones manejadas a través de STDIO (es decir, almacenadas en "espacio de usuario").

Para obtener más información sobre el lado OS/kernel de las cosas, consulte this question on SO; Estoy investigando un par de programas (no solo R + bigmemory) que están produciendo curiosidades para enjuagar el buffer, y ese hilo me ayudó a aclararme sobre el lado kernel de las cosas.

0

¿Es esto más convincente que isIncomplete() funciona con archivos binarios?

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

(Modificado de la (conexiones) de archivos. Ayuda)

+0

Gracias por probar esto. Sin embargo, a menos que malinterprete eso, su ejemplo solo lo usa en el caso de los buffers de entrada.Realmente no tengo claro que funcione en los búferes de salida. No estoy lo suficientemente familiarizado con el buffer de salida para determinar si podemos probarlo de la misma manera. Simplemente soy reacio a ir más allá de la documentación: si su comportamiento es aleatorio, en lugar de determinista, entonces arriesgaré un montón de datos corruptos. He pasado por ese camino, así que soy cauteloso. :) – Iterator

+0

Después de más pruebas, no creo que 'isIncomplete()' funcione para objetos 'bigmemory': parece que los objetos son punteros de algún tipo, en lugar de conexiones. :( – Iterator

+0

Gracias por la sugerencia y el ejemplo. Resulta que en este caso los almacenamientos intermedios se manejan fuera de R. – Iterator

Cuestiones relacionadas