2009-12-17 17 views
12

que estoy recibiendo este error al hacer un git rebase svn en cygwin¿Por qué Git.pm en cygwin se queja de la solicitud de "Memoria agotada durante" grande "?

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 de 256 MB. El tamaño máximo de memoria de Cygwin está configurado en 1024 MB, así que supongo que tiene un tamaño de memoria máximo diferente para Perl.

¿Cómo puedo aumentar el tamaño máximo de memoria que los programas perl pueden usar?

actualización: Aquí es donde se produce 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; 
    } 

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

Update2: Durante la prueba de asignación de memoria en cygwin: de salida de este programa en C era 1536MB

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 programa Perl se estrelló si el tamaño del archivo es mayor que 384 MB (pero tuvo éxito si el tamaño del archivo era menos)

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. 
+1

¿Estás seguro de que la cofiguración de Cygwin es el problema aquí? Msys git viene con su propio msys perl (típicamente 'C: \ Program Files \ Git \ bin \ perl.exe'). No estoy seguro de lo que sucede bajo Cygwin, pero bajo el uso de la consola win32, msysgit usa su Perl en lugar de los otros Perls en mi sistema. – daotoad

+0

Ah sí, tienes razón, pero mi prueba de memoria perl usa la versión de perl de cygwin y también tiene este problema –

Respuesta

9

Este es un problema que se ha resuelto en la última versión de msysgit por Gregor Uhlenheuer. Hay un parche disponible El problema es que en Git.pm, el archivo 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 programa \ Git \ lib \ perl5 \ site_perl \ Git.pm (aproximadamente 8 líneas cambian). Asegúrate de hacer una copia de seguridad primero. Para obtener más información sobre qué hacer, consulte Git.pm: Use stream-like writing in cat_blob().

La discusión original es Problems with larger files "Out of memory".

+0

Este error parece existir para '/ Git/SVN.pm' en msysgit versión 1.8.3, acabo de recibir este error mientras hago una búsqueda de SVN en un repositorio de Git: " Memoria agotada durante la 'gran' solicitud de 69632 bytes, total 'sbrk()' es 219133952 bytes en '/ usr/lib/perl5/site_perl/Git/SVN.pm' línea 1292." –

+0

Todavía recibo este error al intentar clonar un repositorio SVN usando git-svn. Parece que hay alguna limitación de memoria en Perl. Cada vez que el proceso perl.exe llega a ~ 256 MB de uso de memoria, la extracción muere con falta de memoria durante la solicitud de X bytes, sbrk total() es 253132800 bytes. (git versión 1.9.0.msysgit.0) –

5

Esto no es una cuestión de Perl-específica, sino que se relaciona con cygwin. Puede aumentar la asignación de memoria con ulimit.

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

+1

git --version me da 1.6.5.1.1367.gcd48 y estoy usando la última versión de msysgit http : //code.google.com/p/msysgit/ ulimit output ya es 'ilimitado': S –

+0

Sí, estoy usando msysgit también (versión 1.8.3), no Cygwin, y me sale un error similar, pero en '/ usr/lib/perl5/site_perl/Git/SVN.pm' durante un' git svn fetch'. –

8

¿Ha intentado aumentar la memoria útil general de Cygwin?

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

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

 
By default no Cygwin program can allocate more than 384 MB of memory 
(program+data). You should not need to change this default in most 
circumstances. However, if you need to use more real or virtual 
memory in your machine you may add an entry in the either the 
HKEY_LOCAL_MACHINE (to change the limit for all users) or 
HKEY_CURRENT_USER (for just the current user) section of the registry. 

Add the DWORD value heap_chunk_in_mb and set it to the desired 
memory limit in decimal MB. It is preferred to do this in Cygwin 
using the regtool program included in the Cygwin package. (For 
more information about regtool or the other Cygwin utilities, 
see the Section called Cygwin Utilities in Chapter 3 or use 
each the --help option of each util.) You should always be 
careful when using regtool since damaging your system registry 
can result in an unusable system. 
+0

He seguido estas instrucciones para cambiar el tamaño de la memoria http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html usando el programa de ejemplo para probar la asignación de memoria muestra 1536MB por lo que debería ser suficiente memoria.Eso me hace pensar que el problema es con perl: S –

+0

El error muestra que no puede asignar más de 384MiB, por lo que parece que su cambio no se ha realizado correctamente. ¿Ha a) verificado que realmente puede asignar 1.5GiB con el programa de muestra en esa página de manual ?, b) verificó que Perl aún falla al asignar 384MiB (y no cuando asigna más de 1.5GiB)? y c) ¿Reinició la máquina después del cambio (incluso si las instrucciones no lo requieren)? –

+0

Interesante ... Pude malloc 1.5GB de memoria en C, pero no malloc más de 384MB de memoria en perl –

5

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

Actualmente hay dos problemas con Git en Windows:

  1. paquetes de más de 2G son apenas soportado por cualquiera msysgit y Cygwin GIT
  2. memoria predeterminada Cygwin cantidad es demasiado pequeña
  3. de 32 bits Git es problemático

¿Qué he hecho paso a paso:

Moví git repo a máquina Unix, establecer configuraciones siguientes:

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

Después de que hice git gc y todos los paquetes fueron rebuilded a los 2G.

Comprobado nuevamente que MsysGit no está instalado en la máquina con Windows, de otra manera se puede usar Perl de MsysGit.

Se traslada este repo de nuevo a máquina de las ventanas y se crió Cygwin límite de memoria:

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

Era importante fijar la memoria Cygwin mayor que pack.windowMemory × pack.threads y no superior a 1,5 G

Así que los dos primeros los problemas ahora están resueltos Pero el tercero no es.

Desafortunadamente no funciona en windows. Durante algunos reempaques, a veces se cuelga sin memoria. Incluso con threads = 1 y pack.windowMemory = 16M y profundidad máxima y delta establecidas en 250.

Cuestiones relacionadas