private JsonMapNode LoadOrRebuildMap(PageOptions options) { JsonMapNode root; Stopwatch w = Stopwatch.StartNew(); string mapPath = Path.ChangeExtension(options.InputFilePath, ".map.json"); if (_fileSystem.FileExists(mapPath) && _fileSystem.FileGetLastWriteTime(mapPath) > _fileSystem.FileGetLastWriteTime(options.InputFilePath)) { // If map exists and is up-to-date, just reload it Console.WriteLine($"Loading Json Map \"{mapPath}\"..."); root = JsonConvert.DeserializeObject <JsonMapNode>(_fileSystem.FileReadAllText(mapPath)); } else { // Otherwise, build the map and save it (1% -> 10MB limit) double mapSizeLimit = 10 * JsonMapSettings.Megabyte * (options.TargetMapSizeRatio / 0.01); Console.WriteLine($"Building {options.TargetMapSizeRatio:p0} Json Map of \"{options.InputFilePath}\" into \"{mapPath}\"..."); root = JsonMapBuilder.Build(() => _fileSystem.FileOpenRead(options.InputFilePath), new JsonMapSettings(options.TargetMapSizeRatio, mapSizeLimit)); if (root != null) { _fileSystem.FileWriteAllText(mapPath, JsonConvert.SerializeObject(root, Formatting.None)); } } w.Stop(); Console.WriteLine($"Done in {w.Elapsed.TotalSeconds:n1}s."); return(root); }
static void Build(string jsonFilePath, double ratio = 0.01) { string mapPath = Path.ChangeExtension(jsonFilePath, ".map.json"); Console.WriteLine($"Building {ratio:p1} map of \"{jsonFilePath}\"..."); Stopwatch w = Stopwatch.StartNew(); JsonMapNode root = JsonMapBuilder.Build(jsonFilePath, new JsonMapSettings(ratio, (10 * JsonMapSettings.Megabyte) * (ratio / 0.01))); File.WriteAllText(mapPath, JsonConvert.SerializeObject(root, Formatting.None)); Console.WriteLine($"Done in {w.Elapsed.TotalSeconds:n1}s; map is {ToSizeString(new FileInfo(mapPath).Length)}"); Console.WriteLine(); }