Почему делает Git.pm на cygwin, жалуются на 'Из памяти во время “большого” запроса?

Я получаю эту ошибку при выполнении мерзавца svn переоснова в cygwin

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 МБ. maxium емкость памяти Cygwin установлена на 1024 МБ, таким образом, я предполагаю, что она имеет другую максимальную емкость памяти для жемчуга?

Как я могу увеличить максимальную емкость памяти, которую могут использовать программы жемчуга?

обновление: Это - то, где ошибка происходит (в 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, и результат был 1024 за $bytesToRead, и 134220800 за $bytesRead, таким образом, это читает 1 024 байта за один раз, и это уже считало 128 МБ. Функция 'чтения' Perl должна быть вне памяти, и попытка состоит в том, чтобы запросить на двойной, это - емкость памяти... там способ указать сколько памяти для запроса? или это является зависящим от реализации?

UPDATE2: При тестировании выделения памяти в cygwin: вывод Этой программы C составлял 1536 МБ

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;
}

В то время как эта программа жемчуга отказала, если размер файла больше, чем 384 МБ (но следовавший, если размер файла был меньше).

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.
13
задан Matthew Farwell 24 April 2012 в 12:11
поделиться

3 ответа

This is not a Perl-specific issue, but rather one related to cygwin. You can raise memory allocation with ulimit.

What version of git are you using? If you're not on the latest version, this might be an inefficiency that has been fixed with the latest version (e.g. looping through a very large file with foreach rather than while, as google suggests when I did a quick search.)

5
ответ дан 1 December 2019 в 21:12
поделиться

Have you tried increasing overall Cygwin's usable memory?

That message shows Perl was already up to 130 MiB (total sbrk()) and then tried to request a further 256MiB which failed.

From 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. 
8
ответ дан 1 December 2019 в 21:12
поделиться

Решение с максимизацией памяти Cygwin на самом деле не работает.

В настоящее время есть две проблемы с Git в Windows:

  1. Пакеты более 2 Гб вряд ли поддерживается либо MsysGit, либо Cygwin git
  2. память Cygwin по умолчанию сумма слишком мала
  3. 32-битный Git проблематичен

Что я сделал шаг за шагом:

Я переместил репозиторий git на Unix-машину, установил следующие конфигурации:

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

После этого я сделал git gc и все паки переделаны на 2G.

Дважды проверил, что MsysGit не установлен на машине Windows, иначе можно использовать perl из MsysGit.

Переместили это репо обратно на машину Windows и увеличили лимит памяти Cygwin:

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

Было важно установить память Cygwin выше, чем pack.windowMemory × pack.threads и не выше чем 1.5G

Итак, первые две проблемы теперь решены. А вот третьего нет.

К сожалению, это не работает в Windows. При некоторых репаках иногда вылетает с нехваткой памяти. Даже если нитей = 1 и pack.windowMemory = 16M и максимальная глубина и дельта установлены на 250.

5
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: