2009-12-17 7 views
12

Ricevo questo errore mentre si fa un rebase git svn in CygwinPerché Git.pm su cygwin si lamenta della richiesta "Memoria esaurita 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 è 256 MB. La dimensione massima della memoria Cygwin è impostata su 1024 MB, quindi suppongo che abbia una dimensione di memoria massima diversa per perl?

Come è possibile aumentare la dimensione massima della memoria che i programmi Perl possono utilizzare?

aggiornamento: Questo è dove si verifica l'errore (in 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; 
    } 

Ho una stampa prima linea 898 per stampare $ BytesToRead e $ bytesRead e il risultato è stato 1024 per $ bytesToRead e 134220800 for $ BytesRead, quindi sta leggendo 1024 byte alla volta e ha già letto 128 MB. La funzione di "lettura" di Perl deve essere esaurita e sta tentando di richiedere il doppio della sua dimensione di memoria ... c'è un modo per specificare la quantità di memoria da richiedere? o l'implementazione dipende?

UPDATE2: Durante il test di allocazione di memoria in Cygwin: uscita di questo programma 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; 
} 

Anche se questo programma Perl è schiantato se la dimensione del file è superiore a 384 MB (ma è riuscito se la dimensione del file è stato meno).

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

$read = read(F, $s, $size); 

L'errore è simile

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

Sei sicuro che la codifica di Cygwin è il problema qui? Msys git viene fornito con il proprio msys perl (in genere 'C: \ Programmi \ Git \ bin \ perl.exe'). Non sono sicuro di cosa succede sotto Cygwin, ma sotto l'uso della console win32, msysgit usa il suo perl invece degli altri perls sul mio sistema. – daotoad

+0

Ah sì hai ragione, ma il mio test di memoria perl utilizza la versione di perl di cygwin e ha anche questo problema –

risposta

9

Questo è un problema risolto nell'ultima versione di msysgit di Gregor Uhlenheuer. C'è una patch disponibile. Il problema è che in Git.pm, il file viene letto in un colpo solo. La soluzione è leggerlo in piccoli pezzi. Non sono sicuro che la correzione sia stata introdotta in alcuna versione rilasciata, ma la correzione è facile da applicare localmente.

È necessario modificare C: \ Programmi \ Git \ lib \ perl5 \ site_perl \ Git.pm (circa 8 righe cambiano). Assicurati di eseguire il backup prima.

Per i dettagli su cosa fare, vedere Git.pm: Use stream-like writing in cat_blob().

La discussione originale è Problems with larger files "Out of memory".

+0

Questo errore sembra esistere ancora per '/ Git/SVN.pm' in msysgit versione 1.8.3, ho appena ricevuto questo errore mentre eseguivo un recupero SVN in un repository Git: " Memoria insufficiente durante la richiesta 'grande' per 69632 byte, il totale 'sbrk()' è 219133952 byte nella riga '/ usr/lib/perl5/site_perl/Git/SVN.pm' 1292." –

+0

Ricevo ancora questo errore mentre cercavo di clonare un repository SVN usando git-svn. Sembra esserci qualche limite di memoria in Perl. Ogni volta che il processo perl.exe arriva a ~ 256 MB di memoria, il fetch muore con Memoria esaurita durante la richiesta di X byte, sbrk totale() è 253132800 byte! (versione git 1.9.0.msysgit.0) –

5

Questo non è un problema Perl-specifico, ma piuttosto quello relativo alla cygwin. È possibile aumentare l'allocazione di memoria con ulimit.

Quale versione di git stai usando? Se non si è nell'ultima versione, questa potrebbe essere un'inefficienza corretta con la versione più recente (ad es. Il looping di un file molto grande con foreach anziché while, come suggerito da Google quando ho effettuato una ricerca rapida.)

+1

git --version mi dà 1.6.5.1.1367.gcd48 e sto usando l'ultima versione di msysgit http : //code.google.com/p/msysgit/ L'output di ulimit è già 'illimitato': S –

+0

Sì, sto usando anche msysgit (versione 1.8.3), non Cygwin, e ottengo un errore simile, ma in '/ usr/lib/perl5/site_perl/Git/SVN.pm' durante un' git svn fetch'. –

8

Hai provato ad aumentare la memoria usabile complessiva di Cygwin?

Quel messaggio mostra che Perl era già fino a 130 MiB (sbrk totale()) e quindi ha provato a richiedere un ulteriore 256MiB che non è riuscito.

Da 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

Ho seguito queste istruzioni per cambiare la dimensione della memoria http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html utilizzando il programma di esempio per verificare l'assegnazione della memoria mostra 1536 MB, quindi dovrebbe essere sufficiente memoria.Questo mi fa pensare che il problema sia con perl: S –

+0

L'errore mostra che non è stato possibile allocare più di 384MiB, quindi sembra che la tua modifica non sia stata eseguita correttamente. Hai verificato a) che puoi effettivamente allocare 1.5GiB con il programma di esempio in quella pagina di manuale ?, b) verificato che Perl non riesce ancora ad allocare 384MiB (e non quando si assegna più di 1.5GiB)? e c) riavviata la macchina dopo la modifica (anche se le istruzioni non lo richiedono)? –

+0

Interessante ... Sono riuscito a memorizzare 1.5 GB di memoria in C, ma non malloc oltre 384 MB di memoria in perl –

5

Soluzione a massimizzare la memoria Cygwin in realtà non funziona.

Attualmente non ci sono due problemi con Git su Windows:

  1. Pack più di 2G sono difficilmente supportato da uno msysgit e Cygwin git
  2. Cygwin memoria di default importo è troppo piccolo
  3. 32bit Git è problematico

Cosa ho fatto passo dopo passo:

ho spostato il mio git repo a macchina Unix, situato vicino configurazioni:

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

Dopo che ho fatto git gc e tutti i pacchetti sono stati ricostruita a quelli 2G.

Doppio controllo che MsysGit non è installato sulla macchina Windows, può essere utilizzato l'altro perl da MsysGit.

mosse di pronti contro termine di nuovo a macchina Windows e cresciuto limite di memoria Cygwin:

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

E 'stato importante per impostare la memoria Cygwin superiore pack.windowMemory × pack.threads e non superiore a 1.5G

Così i primi due i problemi sono ora risolti. Ma il terzo no.

Purtroppo non funziona su Windows. Durante alcuni repack, a volte si blocca con la memoria esaurita. Anche con threads = 1 e pack.windowMemory = 16M e profondità massima e delta impostato su 250.

Problemi correlati