perl - 为什么 cygwin 上的 Git.pm 会提示 'Out of memory during "large"request?

标签 perl git memory-management cygwin git-svn

我在 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() .

原讨论为Problems with larger files "Out of memory" .

关于perl - 为什么 cygwin 上的 Git.pm 会提示 'Out of memory during "large"request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1918672/

相关文章:

perl - 当我模块化代码时开始发生 "Not an ARRAY reference"错误

php - 如何检测图像是 PNG 还是 APNG 格式?

visual-studio-2010 - 带有 git 的 Visual Studio (Microsoft) 符号服务器

git - 使用 Git 复制子模块

windows - 并行运行 Git GUI 和 Tortoise GUI

debugging - 有没有办法限制ghci可以拥有的内存?

go - 这个 Go 方法是 "allocate new memory"吗?

python - 将带空格的参数传递给 linux 服务

memory-management -/proc/[pid]/status :RssAnon and/proc/[pid]/smaps_rollup:Anonymous? 不一致是什么原因

perl - LDAP 身份验证 CGI