]> git.saurik.com Git - apt.git/commitdiff
de-duplicate version strings in the cache
authorDavid Kalnischkies <david@kalnischkies.de>
Wed, 23 Jul 2014 12:52:11 +0000 (14:52 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Fri, 26 Sep 2014 22:09:40 +0000 (00:09 +0200)
Turns out that version numbers aren't as random as you might guess.
In my cache for example, I have:
  Total package names: 69513 (1390 k)
  Total package structures: 188259 (9036 k)
  Total distinct versions: 186345 (13.4 M)
  Total dependencies: 2052242 (57.5 M)
which amounts to 1035873 (10,1 M) strings.
Reusing version strings reduces this to 161465 (3.479 k).

This comes at a cost of course: Generation is slightly slower, but we
are still faster than what we started with and it makes room (also cache
size wise) for further changes.

apt-pkg/pkgcachegen.cc

index f7480bc772f206826a246b0addd0e9d7add3777b..6df3d5ebd2e52472462c1a2d7948cc53e773dae5 100644 (file)
@@ -609,7 +609,7 @@ bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, const string &Name)
       return false;
 
    Grp = pkgCache::GrpIterator(Cache, Cache.GrpP + Group);
       return false;
 
    Grp = pkgCache::GrpIterator(Cache, Cache.GrpP + Group);
-   map_pointer_t const idxName = WriteStringInMap(Name);
+   map_stringitem_t const idxName = StoreString(PKGNAME, Name);
    if (unlikely(idxName == 0))
       return false;
    Grp->Name = idxName;
    if (unlikely(idxName == 0))
       return false;
    Grp->Name = idxName;
@@ -836,7 +836,7 @@ map_pointer_t pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
       }
    }
    // haven't found the version string, so create
       }
    }
    // haven't found the version string, so create
-   map_stringitem_t const idxVerStr = WriteStringInMap(VerStr);
+   map_stringitem_t const idxVerStr = StoreString(VERSION, VerStr);
    if (unlikely(idxVerStr == 0))
       return 0;
    Ver->VerStr = idxVerStr;
    if (unlikely(idxVerStr == 0))
       return 0;
    Ver->VerStr = idxVerStr;
@@ -933,7 +933,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
       if (index == 0)
       {
         void const * const oldMap = Map.Data();
       if (index == 0)
       {
         void const * const oldMap = Map.Data();
-        index = WriteStringInMap(Version);
+        index = StoreString(VERSION, Version);
         if (unlikely(index == 0))
            return false;
         if (OldDepLast != 0 && oldMap != Map.Data())
         if (unlikely(index == 0))
            return false;
         if (OldDepLast != 0 && oldMap != Map.Data())