大数据集崩溃python脚本

2024-05-16 07:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

对于Rhino/Grasshopper,我有一个使用GyPython组件的简单脚本。目标是将每小时的天气数据(只记录了几个小时)分配到小时。如果没有测量值,则返回0。它的工作原理应该是这样的(具有类似值的示例):

hoursList = [hr1,hr2,hr3,hr4,hr5,hr6]
measuredList = [hr2,hr3,hr6]
recordList = [wData1,wData2,wData3]
finalList = []    

def assignData(i,y):        
    for i < len(leadList):            
        if hoursList[i] == measuredList[y]:                
            finalList.append(recordList[y])                
            i += 1
            y += 1                
        else:                
            finalList.append(0)                
            i += 1    
        assignData(i,y)    

i = 0
y = 0    
assignData(i,y)

哪个应该返回

^{pr2}$

此案例的结果finalList(添加了换行符以帮助可读性)

[0, 'wData1', 'wData2', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 'wData2', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 'wData1', 'wData2', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 'wData2', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
 0, 'wData3', 'wData3']

当我试图在大数据列表(大约43000个值)上运行此代码时,它在大约7000次迭代后崩溃。我查过了sys.getrecursionlimit是2147483647。有什么办法做这个工作吗?在


Tags: 数据rhino小时appendfinallistrecordlisthourslisthr2
1条回答
网友
1楼 · 发布于 2024-05-16 07:31:56

分析

给你一个数字。我称之为limit。在

注意循环是如何工作的:对于“input i”到limit范围内的i的每个值,它处理一个项,递增i(也许还有y),并递归。因此,您在i=0的顶层调用将生成对assignData(1, 0)的调用(假设失败),并等待该调用完成。然后它将回到循环的顶部,使用i=1,然后继续。。。最终连续生成limit递归调用。在

该初始调用现在将在range(1,limit)中工作,生成limit-1调用,第一个调用将生成limit-2调用,依此类推。每一个关卡都会产生另一个关卡。在

简言之,您产生的调用比我想象的要多得多;当您增加limit时,总数增长得相当快。在

我怀疑您的问题是finalList只是超出了可用内存,因为每个调用都附加了一个元素。在

调查

在代码中插入基本调试语句:

def assignData(i, y):
    print "ENTER", i, y, finalList
    for i < len(leadList):
        ...

所以你可以看到通话的进程。在

修复

我怀疑您是否需要这个双重嵌套的递归堆栈。事实上,我不认为递归能给你带来任何好处。看起来你只需要在列表中浏览一次,找到实际对应的时间,否则就填写0。摆脱调用,正确使用for来控制i的值,并根据需要缩减代码。在

^{pr2}$

更好的解决方案

如果你需要的只是匹配时间的记录,你可以让它更直接。建立一个字典来索引时代的测量。在

meas = dict(zip(measuredList, recordList)

现在,编写一个列表理解,以便在不在字典中的任何时候插入0。在

finalList = [meas[time] if time in meas else 0
                for time in hourslist]

如果我没看错你的问题,那就是你的总目标。在

相关问题 更多 >