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