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

如何在Cinema4D中使用Python读取大量csv文件?,python,cinema-4d,Python,Cinema 4d,我有一堆csv文件,其中每列都有一个值,表示Canadarm2的7个段中每个段的角度。最大的文件包含5小时任务每秒的值,是30兆 我在下面的C4D脚本管理器中编写了这个python脚本,该脚本从csv读取数据,并每秒创建关键帧,其中片段根据角度数据旋转 该脚本在大小约为1兆的小文件上运行良好,但我收到了可怕的“Cinema4D已停止响应”警报,或者当我尝试处理较大的文件时,它只是静静地坐在那里,显然什么也没有发生 有人有过类似的经历吗?比我的12首歌还多的记忆会有帮助吗?如果我能在C4D中一次处

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

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

该脚本在大小约为1兆的小文件上运行良好,但我收到了可怕的“Cinema4D已停止响应”警报,或者当我尝试处理较大的文件时,它只是静静地坐在那里,显然什么也没有发生

有人有过类似的经历吗?比我的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有一个可以让事情变得更简单的方法

如果您遇到内存问题,我建议您执行强制垃圾收集。您需要导入gc,然后在循环中输入一个
gc.collect()
。它可能不是每个循环都需要的,如果执行得太频繁,甚至会减慢速度。您可以保留一个计数器变量(
rowcount
可以),并减少使用频率(比如每10000个循环一次。实验)。考虑添加一个指示集合发生的打印语句和行编号。这样,您就可以知道脚本是否仍在运行或是否已锁定

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

如果可以安装外部Python模块,还可以尝试使用。对于非常大的文件,它的性能可能更好,但如果内存仍然不足,则可能必须指定chunksize。

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

接下来,Python有一个本机库,用于:

因此,将其放在一起(根据上面的链接和以下链接改编):

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



垃圾收集现在允许我在不耗尽内存的情况下处理长达一小时的动画。够了。谢谢
with open(filename, 'r') as fileobj:
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)