我在 cygwin 中执行 git svn rebase 时遇到此错误
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 是 256MB。 Cygwin 的最大内存大小设置为 1024MB,所以我猜它对 perl 有不同的最大内存大小?
如何增加 perl 程序可以使用的最大内存大小?
更新: 这是错误发生的地方(在 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;
}
我在第 898 行之前添加了打印以打印出 $bytesToRead 和 $bytesRead,结果 $bytesToRead 为 1024,$bytesRead 为 134220800,因此它一次读取 1024 个字节,并且已经读取了 128MB。 Perl 的“读取”函数一定是内存不足,并且正在尝试请求其内存大小的两倍......有没有办法指定要请求多少内存?还是依赖于实现?
更新 2: 在 cygwin 中测试内存分配时: 这个 C 程序的输出是 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;
}
如果文件大小大于 384MB,此 perl 程序会崩溃(但如果文件大小小于 384MB,则会成功)。
open(F, "<400") or die("can't read\n");
$size = -s "400";
$read = read(F, $s, $size);
错误类似
Out of memory during "large" request for 536875008 bytes, total sbrk() is 217088 bytes at mem.pl line 6.
最佳答案
这个问题在最新版本的msysgit中已经被Gregor Uhlenheuer解决了.有补丁可用。问题是在 Git.pm 中,文件是一次性读取的。解决方案是以小块读取它。我不确定该修复程序是否已进入任何已发布版本,但该修复程序很容易在本地应用。
您需要更改 C:\Program Files\Git\lib\perl5\site_perl\Git.pm(大约 8 行更改)。确保先备份它。
有关操作的详细信息,请参阅 Git.pm: Use stream-like writing in cat_blob() .
关于perl - 为什么 cygwin 上的 Git.pm 会提示 'Out of memory during "large"request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1918672/