如何在 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 吗?它将简化流程并且可以处理大量数据。
我有一堆 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 吗?它将简化流程并且可以处理大量数据。