Why does Git.pm on cygwin complain about 'Out of memory during “large” request?

前端 未结 4 1153
野性不改
野性不改 2020-12-16 15:57

I\'m getting this error while doing a git svn rebase in cygwin

Out of memory during \"large\" request for 268439552 bytes, total sbrk() is 140652544 bytes at         


        
相关标签:
4条回答
  • 2020-12-16 16:28

    Solution with maximizing Cygwin memory actually does not work.

    Currently there are two problems with Git on Windows:

    1. Packs more than 2G are hardly supported by either MsysGit and Cygwin git
    2. Cygwin default memory amount is too small
    3. 32bit Git is problemistic

    What have I done step by step:

    I moved my git repo to Unix machine, set next configs:

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

    After that I made git gc and all packs were rebuilded to 2G ones.

    Double checked that MsysGit is not installed on Windows machine, other way perl from MsysGit may be used.

    Moved this repo back to windows machine and raised Cygwin memory limit:

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

    It was important to set Cygwin memory higher than pack.windowMemory×pack.threads and not higher than 1.5G

    So the first two problems are now solved. But the third is not.

    Unfortunally it does not work on windows. During some repacks it sometimes crashes with out of memory. Even with threads = 1 and pack.windowMemory = 16M and max depth and delta set to 250.

    0 讨论(0)
  • 2020-12-16 16:29

    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. 
    
    0 讨论(0)
  • 2020-12-16 16:34

    This is a problem that has been solved in the latest version of msysgit by Gregor Uhlenheuer. There is a patch available. The problem is that in Git.pm, the file is read in one go. The solution is to read it in small chunks. I'm not sure if the fix has made it into any released versions, but the fix is easy to apply locally.

    You need to change C:\Program Files\Git\lib\perl5\site_perl\Git.pm (about 8 lines change). Make sure you back it up first.

    For the details of what to do, see Git.pm: Use stream-like writing in cat_blob().

    The original discussion is Problems with larger files "Out of memory".

    0 讨论(0)
  • 2020-12-16 16:48

    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.)

    0 讨论(0)
提交回复
热议问题