From cbcac998c5573866fdb1d9c12750d59d3520f22d Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 21 Sep 2020 09:36:00 +0300 Subject: simplify so I can understand the code again Dropped the restarting. --- create-files | 111 +++++++++++++++++++++++++---------------------------------- 1 file changed, 47 insertions(+), 64 deletions(-) diff --git a/create-files b/create-files index c71f495..6cebc6c 100755 --- a/create-files +++ b/create-files @@ -1,77 +1,60 @@ #!/usr/bin/env python3 -import json + import os import sys import time -billion = 10 ** 9 -per_level = 10 ** 3 -interval = 2 -state_filename = "state.json" - - -def level(i, n): - return (i % (per_level ** n)) / (per_level ** (n - 1)) - - -def pathname(i): - fullname = "{:09d}".format(i) - dir1 = fullname[-9:-6] - dir2 = fullname[-6:-3] - dirname = "{}/{}".format(dir1, dir2) - basename = fullname[-3:] - return dirname, basename - - -def create_dir(root, dirname): - try: - os.makedirs(os.path.join(root, dirname)) - except OSError: - pass - +def dirnames(a, b): + dir_a = f"{root}/{a}" + dir_b = os.path.join(dir_a, str(b)) + if not os.path.exists(dir_a): + os.mkdir(dir_a) + if not os.path.exists(dir_b): + os.mkdir(dir_b) + return dir_a, dir_b -def create_file(root, dirname, basename): - try: - open(os.path.join(root, dirname, basename), "w") - except OSError: - return - - -def load_state(): - try: - return json.load(open(state_filename)) - except IOError: - return {} - - -def save_state(i): - state = {"current": i} - with open(state_filename, "w") as f: - json.dump(state, f) +started = time.time() root = sys.argv[1] -start = int(sys.argv[2]) -end = int(sys.argv[3]) - -start = load_state().get("current", start) +if not os.path.exists(root): + os.mkdir(root) -curdir = None -last_checkpoint = time.time() - -i = start -while i < end: - dirname, basename = pathname(i) - if dirname != curdir: - create_dir(root, dirname) - curdir = dirname - create_file(root, dirname, basename) +billion = 10 ** 9 +per_level = 10 ** 3 +a = b = c = 0 +dir_a, dir_b = dirnames(a, b) +prev_status = 0 +for i in range(billion): + filename = os.path.join(dir_b, f"file-{i}") + open(filename, "w").close() + + c += 1 + if c == per_level: + c = 0 + b += 1 + if b == per_level: + b = 0 + a += 1 + dir_a, dir_b = dirnames(a, b) + + percent = 100.0 * float(i) / float(billion) now = time.time() - if now > last_checkpoint + interval: - save_state(i) - last_checkpoint = now - i += 1 - -save_state(i) + duration = now - started + if duration > 1: + speed = i / duration + else: + speed = 1 + if speed < 1: + print(speed, i, duration) + eta = (billion - i) / speed + + if now - prev_status > 1: + sys.stdout.write( + f"\rCreated {c} of {billion} files ({percent:.2f}%), at {speed:.0f}/s, {eta:.0f}s remaining" + ) + prev_status = now + +sys.stdout.write("\n") -- cgit v1.2.1