para - ejecutar fichero python windows
Tamaño de búfer predeterminado para un archivo en Linux (3)
Desde que te vinculaste a los documentos 2.7, asumo que estás usando 2.7. (En Python 3.x, todo esto se vuelve mucho más simple, porque se expone mucho más del búfer en el nivel de Python).
Todo lo que realmente hace open
(en sistemas POSIX) se llama fopen
, y luego, si ha pasado algo para el buffering
en buffering
, setvbuf
. Ya que no está pasando nada, simplemente termina con el búfer predeterminado de fopen
, que depende de su biblioteca estándar de C. (Consulte la fuente para obtener detalles. Sin buffering
, pasa -1 a PyFile_SetBufSize
, que no hace nada a menos que bufsize >= 0
)
Si lees la página de setvbuf
glibc setvbuf
, explica que si nunca llamas a ninguna de las funciones del búfer:
Normalmente todos los archivos están almacenados en bloque. Cuando se produce la primera operación de E / S en un archivo, se llama a
malloc
(3) y se obtiene un búfer.
Tenga en cuenta que no dice qué tamaño de búfer se obtiene. Esto es intencional; significa que la implementación puede ser inteligente y elegir diferentes tamaños de búfer para diferentes casos. (Hay una constante BUFSIZ
, pero solo se usa cuando se llaman funciones heredadas como setbuf
; no se garantiza que se use en ningún otro caso).
Entonces, ¿qué sucede? Bueno, si miras la fuente de glibc, en última instancia llama a la macro _IO_DOALLOCATE
, que se puede enganchar (o anular, porque glibc unifica C ++ streambuf y C stdio buffering), pero en última instancia, asigna un buf de _IO_BUFSIZE
, que es un alias. para la macro específica de la plataforma _G_BUFSIZE
, que es 8192
.
Por supuesto, es probable que desee rastrear las macros en su propio sistema en lugar de confiar en la fuente genérica.
Es posible que se pregunte por qué no hay una forma documentada de obtener esta información. Presumiblemente es porque se supone que no debes preocuparte. Si necesita un tamaño de búfer específico, configure uno manualmente; Si confía en que el sistema sabe mejor, confíe en él. A menos que realmente estés trabajando en el kernel o libc, ¿a quién le importa? En teoría, esto también deja abierta la posibilidad de que el sistema pueda hacer algo inteligente aquí, como elegir un tamaño de archivo basado en el tamaño de bloque para el sistema de archivos del archivo, o incluso basado en datos de estadísticas en ejecución, aunque no se parece a Linux / glibc , FreeBSD o OS X hacen otra cosa que no sea usar una constante. Y lo más probable es que realmente no importa para la mayoría de las aplicaciones. (Es posible que desee probarlo usted mismo: use tamaños de búfer explícitos que van desde 1 KB a 2 MB en algunas secuencias de comandos enlazadas a E / S con búfer y vea cuáles son las diferencias de rendimiento).
La documentation indica que el valor predeterminado para el almacenamiento en búfer es: If omitted, the system default is used
. Actualmente estoy en Red Hat Linux 6, pero no puedo averiguar el búfer predeterminado establecido para el sistema.
¿Puede alguien, por favor, guiarme sobre cómo determinar el almacenamiento en búfer para un sistema?
No estoy seguro de que sea la respuesta correcta, pero la biblioteca de Python 3.0 y la biblioteca de Python 20 describen io.DEFAULT_BUFFER_SIZE
de la misma manera que el valor predeterminado se describe en los documentos para open()
. ¿Coincidencia?
Si no, entonces la respuesta para mí fue:
$ python
>>> import io
>>> io.DEFAULT_BUFFER_SIZE
8192
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
#include <stdio.h>
int main(int argc, char* argv[]){
printf("%d/n", BUFSIZ);
return 0;
}
Hice ''man setvbuf'' para encontrar esto. setvbuf es la nota a pie de página [2] de la página de documentación.