2009-12-17 9 views
12

dostaję ten błąd robiąc rebase git svn w CygwinDlaczego Git.pm na cygwin narzeka na "Brak pamięci podczas" dużego "żądania?

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 jest 256MB. Maksymalny rozmiar pamięci Cygwin jest ustawiony na 1024 MB, więc przypuszczam, że ma on inny maksymalny rozmiar pamięci dla perla?

Jak mogę zwiększyć maksymalny rozmiar pamięci, którego mogą używać programy perl?

zmiana: To gdzie występuje błąd (w 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; 
    } 

Dodałem wydruk przed linią 898 do wydrukowania $ bytesToRead i $ bytesRead i wynik był 1024 dla $ bytesToRead i 134220800 dla $ bytesRead, więc odczytuje 1024 bajty na raz i już przeczytał 128 MB. Funkcja "odczytu" Perla musi być za mało pamięci i próbuje zażądać podwojenia jej rozmiaru pamięci ... czy istnieje sposób na określenie wymaganej ilości pamięci? lub czy ta implementacja jest zależna?

Update2: Podczas testowania alokacji pamięci w Cygwin: wyjście tego program w C był 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; 
} 

Choć ten program Perl rozbił jeśli rozmiar pliku jest większy niż 384MB (ale udało się, jeśli rozmiar pliku był mniej).

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

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

Błąd jest podobna

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

Czy jesteś pewien, że problem dotyczy Cygwin? Msys git ma swój własny periodyk msys (zazwyczaj "C: \ Program Files \ Git \ bin \ perl.exe"). Nie jestem pewien, co dzieje się pod Cygwin, ale przy użyciu konsoli win32, msysgit używa swojego perla zamiast innych perls w moim systemie. – daotoad

+0

Ach tak masz rację, ale mój test pamięci perl używa wersji pergola cygwin i ma ten problem również –

Odpowiedz

9

To jest problem, który został rozwiązany w najnowszej wersji msysgit przez Gregor Uhlenheuer. Dostępna jest łatka. Problem polega na tym, że w Git.pm plik jest odczytywany za jednym razem. Rozwiązaniem jest odczytanie go małymi porcjami. Nie jestem pewien, czy poprawka została wprowadzona do wszystkich wydanych wersji, ale poprawka jest łatwa do zastosowania lokalnie.

Musisz zmienić C: \ Program Files \ Git \ lib \ perl5 \ site_perl \ Git.pm (około 8 linii zmian). Najpierw wykonaj kopię zapasową.

Szczegółowe informacje na temat tego, co należy zrobić, patrz: Git.pm: Use stream-like writing in cat_blob().

Oryginalna dyskusja to Problems with larger files "Out of memory".

+0

Ten błąd nadal występuje dla '/ Git/SVN.pm' w msysgit w wersji 1.8.3, Właśnie dostałem ten błąd podczas pobierania SVN do repozytorium Git: " Brak pamięci podczas "dużego" żądania dla 69632 bajtów, suma 'sbrk()' wynosi 219133952 bajtów w linii '/ usr/lib/perl5/site_perl/Git/SVN.pm' w linii 1292." –

+0

Nadal dostaję ten błąd podczas próby sklonowania repozytorium SVN za pomocą git-svn. Wydaje się, że w Perlu występuje pewne ograniczenie pamięci. Za każdym razem, gdy proces perl.exe dostaje do ~ 256 MB pamięci, pobieranie pobiera z pamięci podczas żądania dla X bajtów, total sbrk() ma 253132800 bajtów! (git wersja 1.9.0.msysgit.0) –

5

To nie jest Perl specyficzne problem, ale raczej związane z Cygwin. Możesz zwiększyć alokację pamięci za pomocą ulimit.

Jaką wersję git używasz? Jeśli nie masz najnowszej wersji, może to oznaczać nieefektywność, która została naprawiona w najnowszej wersji (np. Przeplatanie bardzo dużego pliku o numerze foreach zamiast while, co sugeruje Google, gdy przeprowadziłem szybkie wyszukiwanie).

+1

git --version daje mi 1.6.5.1.1367.gcd48 i używam najnowszej wersji msysgit http : //code.google.com/p/msysgit/ ulimit dane wyjściowe są już "nieograniczone": S –

+0

Tak, używam również msysgit (wersja 1.8.3), a nie Cygwin, i otrzymuję podobny błąd, ale w '/ usr/lib/perl5/site_perl/Git/SVN.pm' podczas' git svn fetch'. –

8

Czy próbowałeś zwiększyć ogólną użyteczną pamięć Cygwin?

Ten komunikat pokazuje, że Perl był już w stanie do 130 MiB (total sbrk()), a następnie próbował zażądać kolejnego 256 MB, które nie powiodło się.

Od 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

Postępuję zgodnie z tymi instrukcjami, aby zmienić rozmiar pamięci http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html przy użyciu przykładowego programu do testowania alokacji pamięci pokazuje 1536 MB, więc powinno wystarczyć pamięć.To sprawia, że ​​myślę, że problem dotyczy perla: S –

+0

Błąd pokazuje, że nie można przydzielić więcej niż 384 MB, więc wygląda na to, że twoja zmiana nie została poprawnie wykonana. Czy a) zweryfikowałeś, że faktycznie możesz przydzielić 1.5GiB z przykładowym programem na tej stronie podręcznika ?, b) zweryfikowałeś, że Perl wciąż zawiedzie przy alokowaniu 384 MBi (a nie przy alokowaniu więcej niż 1,5GiB)? i c) Zrestartować maszynę po zmianie (nawet jeśli instrukcje tego nie wymagają)? –

+0

Interesujące ... Udało mi się zdobyć 1,5 GB pamięci w C, ale nie przekroczyłem 384 MB pamięci w perlu –

5

Rozwiązanie z maksymalizacji pamięć Cygwin faktycznie nie działa.

Obecnie istnieją dwa problemy z Git na Windows:

  1. paczek ponad 2G są ledwie wspierany przez którąkolwiek msysgit i Cygwin git
  2. Cygwin domyślną pamięć kwota jest zbyt mała
  3. 32bit Git jest problematyczny

Co zrobiłem krok po kroku:

Poruszyłem git repo do maszyny Unix, tuż obok configs:

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

Potem zrobiłem git gc i wszystkie pakiety zostały przebudowane do nich 2G.

Podwójnie sprawdzono, czy MsysGit nie jest zainstalowany na komputerze z systemem Windows, w inny sposób można użyć perl z MsysGit.

Przeniesiony tego repo z powrotem do komputera z systemem Windows i Cygwin podniesiony limit pamięci:

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

Ważne było, aby ustawić pamięci Cygwin wyższa niż pack.windowMemory × pack.threads i nie wyższej niż 1,5 g

Więc pierwsze dwa problemy są teraz rozwiązane. Ale trzecia nie jest.

Niestety nie działa w systemie Windows. Podczas niektórych repacks czasami zawiesza się z braku pamięci. Nawet z threads = 1 i pack.windowMemory = 16M i maksymalną głębokością i deltą ustawionymi na 250.