[Durian-svn] [3864] edited exr header script to only check 2k frames, it also makes a summery for average render times, total frames rendered.
campbell
institute at blender.org
Wed May 26 08:15:35 CEST 2010
Revision: 3864
https://blenderinstitute.dyndns.org/durian-svn/?do=log&project=durian&path=/&rev=3864
Author: campbell
Date: 2010-05-26 08:15:35 +0200 (Wed, 26 May 2010)
Log Message:
-----------
edited exr header script to only check 2k frames, it also makes a summery for average render times, total frames rendered.
Modified Paths:
--------------
frm/exr_header_collate.py
Modified: frm/exr_header_collate.py
===================================================================
--- frm/exr_header_collate.py 2010-05-26 06:13:16 UTC (rev 3863)
+++ frm/exr_header_collate.py 2010-05-26 06:15:35 UTC (rev 3864)
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
import os
import subprocess
import time
@@ -2,2 +3,5 @@
+DIR = "/shared/render/"
+BIGNUM = 100000000.0
+
# copied from bpy.utils
@@ -25,100 +29,163 @@
string = "%s%02dh, %02dmin, %0.1fsec" % (neg, hours, minutes, seconds)
return string.replace("00h, ", " ")
-def format_time(file, sec):
- return "%s | %s | %.2f" % (file, smpte_from_seconds(sec), sec)
+def format_time(file, sec, ip):
+ return "%s | %s | %.2f | %s" % (file, smpte_from_seconds(sec), sec, ip)
+
+
+def decode_rendertime(time_str):
+ '''decodes blender rendertime from metadata'''
+ time_split = time_str.split(":")
+ sec = float(time_split.pop())
+ if time_split:
+ sec += float(time_split.pop()) * 60.0
+
+ if time_split:
+ sec += float(time_split.pop()) * 3600.0
+ return sec
+
+
def file_date(path):
#currtime = (year, month, day, hour, min, sec)
# year, month, day, hour, minute, second, weekday, yearday, daylight = now
return time.localtime(os.stat(path)[8])[0:6]
-def main():
- all_rendertimes = []
+def update_render_times(dirname, all_rendertimes, size=(None, None)):
+ dirname_full = os.path.join(DIR, dirname)
+ if not os.path.isdir(dirname_full):
+ print("NOT A DIR:", dirname_full)
+ return
- DIR = "/shared/render/"
- for dirname in os.listdir(DIR):
- dirname_full = os.path.join(DIR, dirname)
- time_file = os.path.join(dirname_full, "render_times.txt")
+ exrs = []
+ time_sec_average = 0.0
+ time_sec_min = BIGNUM
+ time_sec_max = 0.0
- if os.path.isdir(dirname_full):
- exrs = []
+ time_file = os.path.join(dirname_full, "render_times.txt")
+ if os.path.exists(time_file):
+ generate_timefile = False
+ time_file_chtime = file_date(time_file)
+ else:
+ generate_timefile = True
+ time_file_chtime = None
+
+ for exr in sorted(os.listdir(dirname_full)):
+ if exr.endswith(".exr"):
+ # print(exr)
+ exr_full = os.path.join(dirname_full, exr)
+ exrs.append((exr, exr_full))
- if os.path.exists(time_file):
- time_file_chtime = file_date(time_file)
- else:
- time_file_chtime = None
+ if generate_timefile is False:
+ if time_file_chtime < file_date(exr_full):
+ generate_timefile = True
+
+ '''
+ if generate_timefile:
+ print("Timefile writing:", time_file)
+ else:
+ print("Timefile up-to-date:", time_file)
+ '''
+
+ # XXX - always generate
+ if generate_timefile or True:
+ file_rendertimes = []
+ for exr, exr_full in exrs:
+ # yay. we have exr
+
+ out, err = subprocess.Popen(["exrheader", exr_full], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+ # print(out)
+ lines = str(out).split("\\n")
+ lines_rtime = [l for l in lines if "RenderTime " in l]
+
+ if lines_rtime:
+ lines_rtime = [l for l in lines if "RenderTime " in l]
+ lines_ip = [l for l in lines if "Note " in l]
+ lines_size = [l for l in lines if "displayWindow " in l]
+
+ # convert to time
+ sec = decode_rendertime(lines_rtime[0].split()[-1].replace('"', ''))
+
+ # ip of PC rendering
+ ip = lines_ip[0].split(": ", 1)[-1].replace('"', '')
- generate_timefile = False
+ # size
+ size_exr = lines_size[0].replace("(", "").replace(")", "").split()[-2:]
+ size_exr = int(size_exr[0]) + 1, int(size_exr[1]) + 1
+
+ if size != (None, None):
+ if size_exr != size:
+ print("Skipping mismatch size", size_exr, size)
+ continue
+
+ file_rendertimes.append((exr, sec, ip))
+
+ if file_rendertimes:
+ for exr, sec, ip in file_rendertimes:
+ time_sec_average += sec
+
+ time_sec_max = max(time_sec_max, sec)
+ time_sec_min = min(time_sec_min, sec)
- for exr in sorted(os.listdir(dirname_full)):
- if exr.endswith(".exr"):
- # print(exr)
- exr_full = os.path.join(dirname_full, exr)
- exrs.append((exr, exr_full))
-
- if time_file_chtime is None:
- generate_timefile = True
- else:
- if time_file_chtime < file_date(exr_full):
- generate_timefile = True
-
- if generate_timefile:
- print("Timefile writing:", time_file)
- else:
- print("Timefile up-to-date:", time_file)
+ time_sec_average /= len(file_rendertimes)
+
+ file_rendertimes.insert(0, (dirname_full, time_sec_average, ""))
+
+ # write a txt to the farm
+ file_txt = open(time_file, 'w')
+ for item in file_rendertimes:
+ file_txt.write(format_time(*item) + "\n")
+
+ print(time_file)
+
+ all_rendertimes.append(file_rendertimes)
+
+ if time_sec_min == BIGNUM:
+ time_sec_min = 0.0
- if generate_timefile or True:
- file_rendertimes = []
- for exr, exr_full in exrs:
- # yay. we have exr
+ return time_sec_average, time_sec_min, time_sec_max
- out, err = subprocess.Popen(["exrheader", exr_full], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
- # print(out)
- lines = [l for l in out.split("\n") if "RenderTime" in l]
- if lines:
- # convert to time
- time = 0.0
- time_str = lines[0].split()[-1].replace('"', '')
- time_split = time_str.split(":")
- sec = float(time_split.pop())
- if time_split:
- sec += float(time_split.pop()) * 60.0
- if time_split:
- sec += float(time_split.pop()) * 3600.0
+def render_times(blendfile):
+ dirname = blendfile.split("/")[-1].split("\\")[-1].replace(".blend", "")
+ return update_render_times(dirname, [])
+
- file_rendertimes.append((exr, sec))
-
- if file_rendertimes:
- avg = 0.0
- for exr, sec in file_rendertimes:
- avg += sec
-
- avg /= len(file_rendertimes)
-
- file_rendertimes.insert(0, (dirname_full, avg))
-
- # write a txt to the farm
- file_txt = open(time_file, 'w')
- for item in file_rendertimes:
- file_txt.write(format_time(*item) + "\n")
-
- print(time_file)
-
- all_rendertimes.append(file_rendertimes)
+def main():
+ all_rendertimes = []
+ size = 2048, 872
+ DIR = "/shared/render/"
+ for dirname in sorted(os.listdir(DIR)):
+ update_render_times(dirname, all_rendertimes, size=size)
summery = os.path.join(DIR, "render_times.txt")
print(summery)
summery_file = open(summery, 'w')
+ # first wrote totals
+ summery_average_time = 0.0
+ summery_total_time = 0.0
+ summery_total_frames = 0
+
for file_rendertimes in all_rendertimes:
- print(1)
- summery_file.write(format_time(*file_rendertimes[0]) + (" | items %d\n" % (len(file_rendertimes)-1)))
+ for exr, sec, ip in file_rendertimes:
+ summery_total_time += sec
+ summery_total_frames += 1
+
+ summery_average_time = summery_total_time / summery_total_frames
+
+ summery_file.write("Summery: average time %s | total time %s | total frames %d\n" % (smpte_from_seconds(summery_average_time), smpte_from_seconds(summery_total_time), summery_total_frames))
+
+ for file_rendertimes in all_rendertimes:
+ summery_file.write(format_time(*file_rendertimes[0]) + (" | frames %d\n" % (len(file_rendertimes)-1)))
if __name__ == "__main__":
- main()
+ import time
+ while True:
+ print("generating times...")
+ main()
+ time.sleep(3600)
More information about the Durian-svn
mailing list