[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