如何在 Cinema4D 中读取 Python 的大量 csv 文件?

How to read massive csv files with Python inside Cinema4D?

我有一堆 csv 文件,其中每一列都有一个值,代表 Canadarm2 的 7 个部分中的每一个的角度。最大的文件包含 5 小时任务中每秒的值,为 30 兆!

我在下面的 C4D 脚本管理器中编写了这个 python 脚本,该脚本从 csv 读取数据并每秒创建关键帧,其中片段根据角度数据旋转。

该脚本在最大约 1 兆的小文件上运行良好,但我收到了可怕的 "Cinema4D has stopped responding" 警报,或者当我尝试处理更大的文件时,它只是静静地坐在那里,显然没有任何反应。

有没有人有过这样的经历?比我的 12 演出更多的内存可能有帮助吗?如果我能在 C4D 中一次处理 30 分钟的数据,我就赢了。

memLog=''
record = 0
frame=0
path='/Users/...'
filename = path + '30minutes_3meg.csv'
fileobj = open(filename, 'r')

rowcount=0    
for row in fileobj:
    rowcount=rowcount+1
    if rowcount>1:
        ar = row.split(',')
        colcount=0
        for angle in ar:
            if colcount == 0:
                log=angle
                if log==memLog:
                    record=0
                else:
                    record=1
                    print log
                    frame=frame+1

                memLog=log

            if colcount == 2:
                if record==1:
                    rotate(frame,'SR','r',angle)
            elif colcount == 4:
                 if record==1:
                    rotate(frame,'SY','r',angle)
            elif colcount == 6:
                 if record==1:
                    rotate(frame,'SP','r',angle)
            elif colcount == 8:
                if record==1:
                    rotate(frame,'EP','h',angle)  
            elif colcount == 10:
                if record==1:
                    rotate(frame,'WP','h',angle)  
            elif colcount == 12:
                if record==1:
                    rotate(frame,'WY','h',angle)  
            elif colcount == 14:
                if record==1:
                    rotate(frame,'WR','h',angle)  

            colcount=colcount+1

Python 有一个 csv module 这可能会让事情变得更容易。

如果您 运行 遇到内存问题,我建议您进行强制垃圾回收。您执行 import gc,然后在循环中执行 gc.collect()。它可能不需要每个循环,如果过于频繁甚至会减慢速度。您可以保留一个计数器变量(rowcount 可以)并且不那么频繁地进行(例如,每 10,000 次循环一次。实验。)。考虑添加一个打印语句,指示收集发生和行号。这样你就可以判断脚本是否仍然 运行 或者它是否已经锁定。

if rowcount % 10000 == 0:
    print 'collecting', rowcount
    gc.collect()

如果您可以安装外部 Python 模块,您也可以尝试使用 Pandas to load the csv file。对于非常大的文件,它可能表现更好,但如果您仍然 运行 内存不足,则可能必须指定块大小。

首先,使用文件打开器进行解析的最简单方法是with

with open(filename, 'r') as fileobj:

接下来,Python 有一个 csv (called csv) 的本机库:

所以把它放在一起(改编自上面的 link 和 mgilson):

import csv

with open(filename, 'r') as fileobj:

    filereader = csv.reader(fileobj, delimiter=',')
    colcount = len(next(filereader)) #Reads the first line and gets length
    if colcount == 0:
        record = 0
    else:
        record = 1 
    for row in filereader: 
        ar = row.split(',') #Split the row
        print (ar2) #prints out all of the rows 
        frame = colcount + 1 #Warning this will make an even column an odd number
        memLog = ar[colcount - 1]
        angle = ar[colcount - 1]
        if colcount == 2:
            if record==1:
                rotate(frame,'SR','r',angle)
        elif colcount == 4:
             if record==1:
                rotate(frame,'SY','r',angle)
        elif colcount == 6:
             if record==1:
                rotate(frame,'SP','r',angle)
        elif colcount == 8:
            if record==1:
                rotate(frame,'EP','h',angle)  
        elif colcount == 10:
            if record==1:
                rotate(frame,'WP','h',angle)  
        elif colcount == 12:
            if record==1:
                rotate(frame,'WY','h',angle)  
        elif colcount == 14:
            if record==1:
                rotate(frame,'WR','h',angle)  

旁注:如果您发现自己经常这样做,我可以建议 pandas 吗?它将简化流程并且可以处理大量数据。