¿Por qué Git.pm on cygwin se queja de la request de "Falta de memory durante" grande "?

Obtengo este error mientras hago un git svn rebase en cygwin

Out of memory during "large" request for 268439552 bytes, total sbrk() is 140652544 bytes at /usr/lib/perl5/site_perl/Git.pm line 898, <GEN1> line 3. 

268439552 es 256MB. El tamaño máximo de memory de Cygwin está configurado en 1024 MB, así que supongo que tiene un tamaño de memory máximo diferente para Perl.

¿Cómo puedo boost el tamaño máximo de memory que los progtwigs perl pueden usar?

actualización: aquí es donde ocurre el error (en Git.pm):

  while (1) { my $bytesLeft = $size - $bytesRead; last unless $bytesLeft; my $bytesToRead = $bytesLeft < 1024 ? $bytesLeft : 1024; my $read = read($in, $blob, $bytesToRead, $bytesRead); //line 898 unless (defined($read)) { $self->_close_cat_blob(); throw Error::Simple("in pipe went bad"); } $bytesRead += $read; } 

He agregado una printing antes de la línea 898 para imprimir $ bytesToRead y $ bytesRead y el resultado fue 1024 para $ bytesToRead y 134220800 para $ bytesRead, por lo que está leyendo 1024 bytes a la vez y ya ha leído 128MB. La function de "lectura" de Perl debe estar sin memory y está tratando de solicitar el doble de su tamaño de memory … ¿hay alguna forma de especificar cuánta memory solicitar? o es esa implementación dependiente?

ACTUALIZACIÓN2: Al probar la asignación de memory en cygwin: La salida de este progtwig C fue de 1536 MB

 int main() { unsigned int bit=0x40000000, sum=0; char *x; while (bit > 4096) { x = malloc(bit); if (x) sum += bit; bit >>= 1; } printf("%08x bytes (%.1fMb)\n", sum, sum/1024.0/1024.0); return 0; } 

Si bien este progtwig perl se bloqueó si el tamaño del file es mayor a 384 MB (pero se logró si el tamaño del file fue menor).

 open(F, "<400") or die("can't read\n"); $size = -s "400"; $read = read(F, $s, $size); 

El error es similar

 Out of memory during "large" request for 536875008 bytes, total sbrk() is 217088 bytes at mem.pl line 6. 

Este es un problema que ha sido resuelto en la última versión de msysgit por Gregor Uhlenheuer . Hay un parche disponible El problema es que en Git.pm, el file se lee de una vez. La solución es leerlo en pequeños trozos. No estoy seguro de si la corrección se ha convertido en alguna versión lanzada, pero la solución es fácil de aplicar localmente.

Debe cambiar C: \ Archivos de progtwig \ Git \ lib \ perl5 \ site_perl \ Git.pm (cambian aproximadamente 8 líneas). Asegúrate de hacer una copy de security primero.

Para get más información sobre qué hacer, consulte Git.pm: use escritura similar a stream en cat_blob () .

La discusión original es Problemas con files más grandes "Sin memory" .

¿Has intentado boost la memory útil general de Cygwin?

Ese post muestra que Perl ya tenía 130 MiB (sbrk total) y luego intentó solicitar otros 256Mib que fallaron.

De http://www.perlmonks.org/?node_id=541750

 De manera pnetworkingeterminada, ningún progtwig de Cygwin puede asignar más de 384 MB de memory 
 (progtwig + datos).  No debería necesitar cambiar este valor pnetworkingeterminado en la mayoría 
 circunstancias.  Sin embargo, si necesita usar más real o virtual 
 memory en su máquina, puede agregar una input en el 
 HKEY_LOCAL_MACHINE (para cambiar el límite para todos los usuarios) o
 HKEY_CURRENT_USER (solo para el usuario actual) sección del logging.

 Agregue el valor DWORD heap_chunk_in_mb y configúrelo en el valor deseado 
 límite de memory en MB decimal  Se prefiere hacer esto en Cygwin 
 utilizando el progtwig regtool incluido en el package Cygwin.  (Por 
 más información sobre Regtool o las otras utilidades de Cygwin, 
 vea la Sección llamada Cygwin Utilities en el Capítulo 3 o use 
 cada una de las opciones --ayuda de cada utilidad.) Usted siempre debe 
 cuidado al usar Regtool ya que daña el logging de tu sistema
 puede resultar en un sistema inutilizable. 

Este no es un problema específico de Perl, sino uno relacionado con cygwin. Puede boost la asignación de memory con ulimit .

¿Qué versión de git estás usando? Si no está en la última versión, podría tratarse de una ineficacia que se ha solucionado con la última versión (por ejemplo, recorrer un file muy grande con foreach lugar de while , como sugiere google cuando hice una búsqueda rápida).

La solución con la maximización de la memory Cygwin en realidad no funciona.

Actualmente hay dos problemas con Git en Windows:

  1. Los packages más de 2G apenas son compatibles con MsysGit y Cygwin git
  2. La cantidad de memory pnetworkingeterminada de Cygwin es demasiado pequeña
  3. 32bit Git es problemático

¿Qué he hecho paso a paso?

Moví mi repository git a la máquina Unix, establecí las siguientes configuraciones:

 [pack] threads = 2 packSizeLimit = 2G windowMemory = 512M 

Después de eso hice git gc y todos los packages fueron reconstruidos a 2G.

Verificó dos veces que MsysGit no está instalado en la máquina de Windows, de otra manera se puede usar Perl de MsysGit.

Moví este repository de return a la máquina de Windows y elevé el límite de memory de Cygwin:

 regtool -i set /HKLM/Software/Cygwin/heap_chunk_in_mb 1536 

Era importante establecer la memory Cygwin por encima de pack.windowMemory × pack.threads y no por encima de 1.5G

Entonces los primeros dos problemas ahora están resueltos. Pero el tercero no es.

Desafortunadamente no funciona en Windows. Durante algunos reempaques, a veces se cuelga sin memory. Incluso con threads = 1 y pack.windowMemory = 16M y max depth y delta establecidos en 250.