我有一个Oracle数据库,我不能在里面添加新的表,因此在Django上我创建了一个sqlite数据库,基本上只是为了将Oracle数据库中的项目同步到sqlite。在
目前Oracle数据库中有大约50万个条目。在
Oracle数据库中的所有主键都是增量的,但是不能保证。当数据库和数据库之间的连接丢失时,我有时会丢失数据库和数据库之间的连接。在
因此,我在Django内部设计了一个模型:
class sequential_missing(models.Model):
database = models.CharField(max_length=200, primary_key=True)
row = models.IntegerField(primary_key=True)
基本上在数据库中有一行,在Oracle端是丢失的,我将比较sqlite数据库中丢失的序列号,并找出缺少的序列号在Oracle数据库中实际上是空的。因此,加快了不实际检查所有缺失的序列值的过程。在
整个功能如下:
^{pr2}$代码分为3部分:
找出丢失的序列值
如果模型和p值之间有匹配的话
创建一个不包含第2节中包含的行的新数组。
问题是第2节花费了很长的时间O(n^2),因为它必须遍历整个数据库并检查该行最初是否为空。在
有没有一种更快的方法,同时消耗最少的内存?在
编辑:
使用ROW-IN更好
setItem = []
for items in missingValues:
setItem.append(items)
print "Items in setItem:" + str(len(setItem))
currentCounter = 0
currentEndCounter = 500
counterIncrement = 500
emptyRowAppend = []
end = False
firstPass = False
while(end == False):
emptyRow = sequential_missing.objects.filter(database=databaseName, row__in = setItem[currentCounter:currentEndCounter])
for items in emptyRow:
emptyRowAppend.append(items.row)
if(firstPass == True):
end = True
if ((currentEndCounter+counterIncrement)>maxValue):
currentCounter += counterIncrement
currentEndCounter = maxValue
firstPass = True
else:
currentCounter += counterIncrement
currentEndCounter += counterIncrement
print "Removing empty numbers," + "Empty Row Append Size:" + str(len(emptyRowAppend)) + ", Missing Value Size:" + str(len(missingValues)) + ", Set Item Size:" + str(len(setItem)) + ", Empty Row:" + str(len(emptyRowAppend))
missingValuesCompared = []
for idx, val in enumerate(missingValues):
found = False
for items in emptyRowAppend:
if(val == items):
found = True
break
if(found == False):
missingValuesCompared.append(val)
您可以替换此代码
与
^{pr2}$以便向数据库发出单个查询。但是,这将连接字符串中所有丢失的值,该字符串必须插入查询中。你应该试试看是否可行。在
否则,您应该同时订购缺失值和顺序_缺少.objects通过val,这样你就可以在线性时间内找到项目。比如:
相关问题 更多 >
编程相关推荐