git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Git exhausts memory.

From
AWAlif Wahid <alif.wahid@gmail.com>
Date
Apr 2, 2011, 05:01 UTC
Message-ID
<BANLkTin=yUtzbZjs_92FHDfs62VFFuLHwg@mail.gmail.com>
Hi there,

I'm using Git v1.7.1 on Ubuntu v10.10 and unfortunately Git seems to regularly exhaust the memory on my machine and fails to compress loose objects and/or collect garbage.

My Intel based dual-core machine has 2 GB of RAM and 4 GB of swap space. I need to track a working tree with a handful of really large tarballs that rarely change and loads of really small text files that change frequently. What I'm seeing is that over time whenever "git gc" runs automatically it fails with the message "fatal: Out of memory, malloc failed". So I've been trying to manually run "git repack -ad --window-memory=1g --max-pack-size=1g" in the hope that Git will not exceed the physical memory. But I still get the same error message :(

As I can't make my repository public, I've attached a simple Python script that generates a ~1.3 GB file containing random integers (takes roughly 10 min. on my machine). Then I run the following four commands and get the out-of-memory failure from "git repack". This is effectively emulating the scenario I have with my repository.

$ git init $ git add ./test_data.dat $ git commit ./test_data.dat -m "Test data." $ git repack -ad --window-memory=1g --max-pack-size=1g Counting objects: 3, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. fatal: Out of memory, malloc failed

I can't find anything on the wiki about out-of-memory failures. Any info/help would be much appreciated.

Regards
Alif
#! /usr/bin/env python
import sys, os, random
if __name__ == '__main__':
    fbuff = 2**28   # file buffer size in bytes
    fints = 10**8   # number of integers to write
    fsize = 12      # number of digits to write per integer
    
    fname = os.path.splitext(os.path.basename(sys.argv[0]))[0]
    try:
        os.mkdir(fname)
    except OSError:
        pass    # directory already exists
        
    fpath = os.path.join(fname, fname+'.dat')
    fhand = open(fpath, 'w', fbuff)
    
    sys.stdout.write('Writing %d MB to file \'%s\'\n' % (fints*(fsize+1)/10**6, fpath))
    sys.stdout.write('This will take some time, please wait.\n')
    sys.stdout.write('Progress:')
    sys.stdout.flush()
    random.seed(-1)
    fform = '%'+str(fsize)+'d\n'
    for x in xrange(fints): 
        fhand.write(fform % (random.randint(0,fints)))
        if x % (fints/10) == 0 and x > 0:
            sys.stdout.write('%3d/10' % (x/(fints/10))) 
            sys.stdout.flush()
    sys.stdout.write(' 10/10\n')
    sys.stdout.flush()
    fhand.close()
Next: Nicolas Pitre
Message 1 of 19 in “Git exhausts memory.”
  1. Alif WahidApr 2, 2011
  2. Nicolas PitreApr 2, 2011
  3. Alif WahidApr 3, 2011
  4. Nicolas PitreApr 3, 2011
  5. Alif WahidApr 4, 2011
  6. Nguyen Thai Ngoc DuyApr 4, 2011
  7. David FriesApr 5, 2011
  8. Alif WahidApr 5, 2011
  9. Nguyen Thai Ngoc DuyApr 5, 2011
  10. Alif WahidApr 5, 2011
  11. Holger HellmuthApr 5, 2011
  12. Shawn PearceApr 5, 2011
  13. Junio C HamanoApr 5, 2011
  14. Nicolas PitreApr 5, 2011
  15. Junio C HamanoApr 5, 2011
  16. Shawn PearceApr 5, 2011
  17. Nicolas PitreApr 6, 2011
  18. Jay SoffianApr 6, 2011
  19. Junio C HamanoApr 6, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.