diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -463,7 +463,27 @@ # skip nonexistent file self.entries = set() return - self.entries = set(decodedir(fp.read()).splitlines()) + + self.entries = [] + totalsize = self.vfs.stat('fncache').st_size + chunksize = (10 ** 6) # 1 MB + chunk = b'' + chunksize = min(totalsize, chunksize) + totalsize -= chunksize + while chunksize: + chunk += fp.read(chunksize) + try: + p = chunk.rindex(b'\n') + self.entries.extend(decodedir(chunk[:p + 1]).splitlines()) + chunk = chunk[p + 1:] + except ValueError: + # substring '\n' not found, maybe the entry is bigger than the + # chunksize, so let's keep iterating + pass + chunksize = min(totalsize, chunksize) + totalsize -= chunksize + + self.entries = set(self.entries) self._checkentries(fp) fp.close()