2009-12-17 25 views
12

Tôi nhận được lỗi này trong khi làm một rebase git svn trong CygwinTại sao Git.pm trên Cygwin lại phàn nàn về yêu cầu 'Hết bộ nhớ trong khi' lớn '?

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 là 256MB. Kích thước bộ nhớ tối đa của Cygwin được đặt thành 1024MB vì ​​vậy tôi đoán rằng nó có kích thước bộ nhớ tối đa khác nhau cho perl?

Làm cách nào để tăng kích thước bộ nhớ tối đa mà các chương trình perl có thể sử dụng?

update: Đây là nơi các lỗi xảy ra (trong 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; 
    } 

Tôi đã thêm một bản in trước khi dòng 898 để in ra $ bytesToRead và $ bytesRead và kết quả là 1024 cho $ bytesToRead và 134220800 cho $ bytesRead, do đó, nó đọc 1024 byte tại một thời điểm và nó đã đọc 128MB. Chức năng 'đọc' của Perl phải hết bộ nhớ và đang cố gắng yêu cầu gấp đôi kích thước bộ nhớ của nó ... có cách nào để xác định dung lượng bộ nhớ cần yêu cầu không? hoặc là thực hiện phụ thuộc?

UPDATE2: Trong khi thử nghiệm cấp phát bộ nhớ trong Cygwin: đầu ra chương trình C này là 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; 
} 

Trong khi chương trình perl này bị rơi nếu kích thước tập tin lớn hơn 384MB (nhưng thành công nếu kích thước tập tin là ít).

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

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

Lỗi này là tương tự

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

Bạn có chắc chắn rằng Cygwin cofiguration là vấn đề ở đây không? Msys git đi kèm với msys perl (thường là 'C: \ Program Files \ Git \ bin \ perl.exe'). Tôi không chắc chắn những gì xảy ra dưới Cygwin, nhưng theo win32 giao diện điều khiển sử dụng, msysgit sử dụng perl của nó thay vì các perls khác trên hệ thống của tôi. – daotoad

+0

Ah có bạn đúng, nhưng kiểm tra bộ nhớ perl của tôi sử dụng phiên bản của perl Cygwin và nó có vấn đề này cũng như –

Trả lời

9

Đây là sự cố đã được giải quyết trong phiên bản mới nhất của msysgit theo Gregor Uhlenheuer. Có sẵn một bản vá. Vấn đề là trong Git.pm, tập tin được đọc trong một lần. Giải pháp là đọc nó theo từng phần nhỏ. Tôi không chắc liệu bản sửa lỗi đã được đưa vào bất kỳ phiên bản phát hành nào chưa, nhưng bản sửa lỗi rất dễ áp ​​dụng tại địa phương.

Bạn cần thay đổi C: \ Program Files \ Git \ lib \ perl5 \ site_perl \ Git.pm (khoảng 8 dòng thay đổi). Hãy chắc chắn rằng bạn sao lưu nó lên đầu tiên.

Để biết chi tiết về những việc cần làm, hãy xem Git.pm: Use stream-like writing in cat_blob().

Cuộc thảo luận ban đầu là Problems with larger files "Out of memory".

+0

Lỗi này có vẻ vẫn tồn tại đối với '/ Git/SVN.pm' trong phiên bản msysgit 1.8.3, tôi chỉ gặp lỗi này khi thực hiện tìm nạp SVN vào repo Git: " Hết bộ nhớ trong khi yêu cầu 'lớn' cho 69632 byte, tổng 'sbrk()' là 219133952 byte tại dòng '/ usr/lib/perl5/site_perl/Git/SVN.pm' 1292." –

+0

Tôi vẫn nhận được lỗi này trong khi cố gắng sao chép một repo SVN bằng git-svn. Dường như có một số hạn chế về bộ nhớ trong Perl. Bất cứ khi nào quá trình perl.exe được sử dụng bộ nhớ ~ 256MB, tìm nạp chết với bộ nhớ ngoài trong khi yêu cầu cho X byte, tổng sbrk() là 253132800 byte! (git phiên bản 1.9.0.msysgit.0) –

5

Đây không phải là vấn đề Perl cụ thể, mà là một liên quan đến Cygwin. Bạn có thể tăng cấp phát bộ nhớ với ulimit.

Bạn đang sử dụng phiên bản git nào? Nếu bạn không sử dụng phiên bản mới nhất, điều này có thể không hiệu quả đã được sửa với phiên bản mới nhất (ví dụ: lặp qua một tệp rất lớn với foreach thay vì while, như google gợi ý khi tôi thực hiện tìm kiếm nhanh.)

+1

git --version cho tôi 1.6.5.1.1367.gcd48 và tôi đang sử dụng phiên bản mới nhất của msysgit http : //code.google.com/p/msysgit/ đầu ra ulimit đã là 'không giới hạn': S –

+0

Vâng, tôi đang sử dụng msysgit quá (phiên bản 1.8.3), không phải Cygwin, và tôi nhận được một lỗi tương tự, nhưng trong '/ usr/lib/perl5/site_perl/Git/SVN.pm' trong' git svn fetch'. –

8

Bạn đã thử tăng bộ nhớ khả dụng của Cygwin?

Thông báo đó cho thấy Perl đã lên đến 130 MiB (tổng sbrk()) và sau đó cố gắng yêu cầu thêm 256MiB không thành công.

Từ 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

Tôi đã làm theo các hướng dẫn này để thay đổi kích thước bộ nhớ http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html bằng cách sử dụng chương trình mẫu để kiểm tra phân bổ bộ nhớ cho thấy 1536MB vì ​​vậy nó sẽ là đủ ký ức.Điều đó làm cho tôi nghĩ rằng vấn đề là với perl: S –

+0

Lỗi cho thấy nó không phân bổ nhiều hơn 384MiB, do đó, có vẻ như thay đổi của bạn đã không được thực hiện một cách chính xác. Bạn đã a) xác minh bạn thực sự có thể phân bổ 1.5GiB với chương trình mẫu trong trang hướng dẫn đó không ?, b) xác minh rằng Perl vẫn không thành công khi phân bổ 384MiB (và không khi phân bổ nhiều hơn 1,5GiB)? và c) Khởi động lại máy sau khi thay đổi (ngay cả khi hướng dẫn không yêu cầu)? –

+0

Thú vị ... Tôi đã có thể malloc 1.5GB bộ nhớ trong C, nhưng không malloc hơn 384MB bộ nhớ trong perl –

5

Giải pháp với việc tối đa hóa bộ nhớ Cygwin thực sự không hoạt động.

Hiện nay có hai vấn đề với Git trên Windows:

  1. Packs hơn 2G là khó được hỗ trợ bởi một trong hai MSysGit và Cygwin git
  2. bộ nhớ mặc định Cygwin lượng quá nhỏ
  3. 32bit Git là vấn đề

Tôi đã làm gì từng bước:

tôi chuyển repo của tôi git để máy Unix, thiết configs tiếp theo:

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

Sau đó tôi làm git gc và tất cả các gói được rebuilded cho những người 2G.

Kiểm tra kỹ rằng MsysGit chưa được cài đặt trên máy Windows, có thể sử dụng cách khác perl từ MsysGit.

Moved repo này trở lại cửa sổ máy và lớn lên giới hạn bộ nhớ Cygwin:

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

Điều quan trọng để thiết lập bộ nhớ Cygwin cao hơn pack.windowMemory × pack.threads là và không cao hơn 1.5G

Vì vậy, hai người đầu tiên các vấn đề đang được giải quyết. Nhưng thứ ba thì không.

Không may, nó không hoạt động trên các cửa sổ. Trong một số repacks đôi khi nó bị treo với hết bộ nhớ. Ngay cả với threads = 1pack.windowMemory = 16M và độ sâu tối đa và đồng bằng được đặt thành 250.

Các vấn đề liên quan