1

我有一堆 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
4

2 回答 2

1

Python 有一个csv模块可以让事情变得更简单。

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

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

如果可以安装外部 Python 模块,也可以尝试使用Pandas 加载 csv 文件。对于非常大的文件,它可能会表现得更好,但如果您的内存仍然不足,您可能必须指定一个块大小。

于 2018-08-19T03:20:19.230 回答
0

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

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

接下来,Python 有一个用于 csv 的本机库(称为 csv)

所以把它放在一起(改编自上面的链接和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吗?它将简化流程并且可以处理大量数据。


于 2018-08-19T03:50:05.367 回答