我必须比较xls格式的大量数据库转储,以解析日常变化(粗略,对吧?)。我目前正以最落后的方式执行此操作,并使用xlrd将xls转换为csv文件,然后我运行差异来比较它们。
因为它是一个数据库,而且我没有办法知道数据在删除项目之后是否保持相同的顺序,我不能在文件之间进行比较x行到x行,所以做元组列表或其他东西对我来说不是最有意义的。
我基本上需要找到在该行的实际转储中的任何行REGARDLESS可能发生的每一个更改,并且我能想到的唯一真正的“查找”是SKU作为唯一ID(它是产品表)来自古老的数据库系统),但我需要了解的不仅仅是被删除或添加的产品,因为它们可以修改该项目中的定价或其他任何内容。
我应该使用套装吗?一旦我将75,000多行此数据库文件加载到“set”中,我的ram用法是否会变得歇斯底里?
我想在xls的每一行中加载一个大的连接字符串来添加到一个集合中。这是一个有效的想法吗?我基本上可以获得不同组之间的行列表,然后返回原始db文件中的那些行以找到我的实际差异。
我从未在像这样的规模上使用数据解析。我大多只是在寻找任何建议,不要让这个过程变得比以前更荒谬了,而且我没有真正找到一些看起来特别适合我的情况的东西来到这里感觉是好建议。提前谢谢。
答案 0 :(得分:3)
我应该使用套装吗?
可能不是。然而,这个问题太模糊了。
一旦我将75,000多行此数据库文件加载到“set”中,我的ram用法是否会变得歇斯底里?
没有。 75000个对象并不多。这不是很大。它甚至没有接近大规模。
Python为您提供http://docs.python.org/library/difflib.html,它可以帮助您创建稍微更优化的算法。
由于您要转储数据库,最好将其转储为CSV文件而不是XLS文件。 CSV文件更容易使用。
这是使用CSV的蛮力。
import csv
with open('yesterday.csv','rb') as yesterday:
rdr= csv.DictReader( yesterday )
baseline= {}
for row in rdr:
baseline[ row['key'] ]= row
with open('today.csv', 'rb' ) as today:
rdr= csv.DictReader( today )
update= {}
for row in rdr:
if baseline[row['key']] == row:
continue
# You have a delta
答案 1 :(得分:2)
我正是为了这个目的使用套装,但是尝试一次将项目数量减少到几百万。正如S.Lott所说,75,000没什么。我使用类似的系统从导入的日期填充数据库表,同时只发出从最后一次导入的结果“修补”表所需的最小数量的INSERT和DELETE。基本算法遵循:
lastset = [...] # Populate with the output of the last run
thisset = [...] # The current results
# Remove rows that aren't in the current result set
for row in lastset - thisset:
deleteentry(row[0]) # Where row[0] is the unique key for the table
# Add rows that weren't in the last result set
for row in thisset - lastset:
insertentry(row)
为了说服自己设置操作快速且足够RAM,请尝试以下方法:
>>> a = set(range(10000000))
>>> b = set(range(100, 10000100))
>>> len(a - b)
100
>>> len(b - a)
100
我的Mac上需要大约1.25GB。这是很多内存,但是可能来自你正在使用的条目数量的100多倍。设置操作在这里运行不到一秒钟。
答案 2 :(得分:0)
您可以将数据加载到数据库中,并比较数据库。如果你认为这更容易。
您可能需要考虑的关键问题是:您能以某种方式对数据进行排序吗?
排序集更容易处理。
P.S。 75000行不非常多。任何适合普通计算机主存的东西都不多。添加几个0。