我正在尝试使用LotusScript和Python(noteslib模块)从视图(Lotus Notes)获取所有数据并将其导出到csv,但是问题是这花费了太多时间。我尝试了两种方式遍历所有文档:
import noteslib
db = noteslib.Database('database','file.nsf')
view = db.GetView('My View')
doc = view.GetFirstDocument()
data = list()
while doc:
data.append(doc.ColumnValues)
doc = view.GetNextDocument(doc)
要获得约1000行数据,我花了70秒钟,但是视图有约85000行,因此获取所有数据将花费太多时间,因为在Lotus Notes中使用File-> Export时,手动进行操作大约需要2分钟。将所有数据导出到csv。
我尝试了AllEntries的第二种方法,但是速度甚至更慢:
database = []
ec = view.AllEntries
ent = ec.Getfirstentry()
while ent:
row = []
for v in ent.Columnvalues:
row.append(v)
database.append(row)
ent = ec.GetNextEntry(ent)
我在Internet上找到的所有内容都基于“ NextDocument”或“ AllEntries”。有什么方法可以更快地做到这一点?
答案 0 :(得分:1)
代码在视图导航之外发生了一些事情:您已经选择了使用“ GetFirstDocument”和“ GetNextDocument”来导航视图的最高效方式。如注释中所述,使用NotesViewNavigator会更好一些,但意义不大。
通过设置view.AutoUpdate = False,您可能会从代码中获得一些性能,以防止后端中的某些内容发生更改时刷新视图对象。但是,由于您仅读取数据而不更改视图数据,因此不会大大提高性能。
我的建议:通过注释掉单个部分来找出代码的真正瓶颈,以找出何时开始变慢:
第一次尝试:
Column1 : LOH
Column2 : ANKH
慢吗?
如果没有,那么下一次尝试:
while doc:
doc = view.GetNextDocument(doc)
慢吗?
如果是,ColumnValues是您的敌人... 如果不是,则下一次尝试:
while doc:
arr = doc.ColumnValues
doc = view.GetNextDocument(doc)
我很想得到您开始变慢的结果。
答案 1 :(得分:0)
从时间角度来看,打开Notes文档非常(或至少以前很昂贵),就像您在代码中所做的一样。 由于您要导出视图中显示的数据,因此可以使用NotesViewEntry类。它应该快很多。
Set col = view.AllEntries
Set entry = col.GetFirstEntry()
Do Until entry Is Nothing
values = entry.ColumnValues '*** Array of column values
'*** Do stuff here
Set entry = col.GetNextEntry(entry)
Loop
我在2013年写了一篇关于此的博客:
http://blog.texasswede.com/which-is-faster-columnvalues-or-getitemvalue/