我试图通过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)
我在互联网上找到的所有内容都基于“NextDocument”或“AllEntries”。有没有办法更快地做到这一点?
您的代码在视图导航“外部”进行了一些操作:您已经选择了使用“GetFirstDocument”和“GetNextDocument”导航视图的最高性能方式。使用注释中提到的NotesViewNavigator会稍好一点,但不重要。
通过设置view.AutoUpdate = False可以从代码中获得一些性能,以禁止在后端中的某些内容发生更改时刷新视图对象。但是,因为您只读取数据而不更改视图数据,这些数据不会给您带来很大的性能提升。
我的建议:通过注释单个部分来确定代码的真正瓶颈,以找出它开始变慢的时间:
第一次尝试:
while doc:
doc = view.GetNextDocument(doc)
慢?
如果没有那么下次尝试:
while doc:
arr = doc.ColumnValues
doc = view.GetNextDocument(doc)
慢?
如果是:ColumnValues是你的敌人......如果没有,则下次尝试:
while doc:
arr = doc.ColumnValues
data.append(arr)
doc = view.GetNextDocument(doc)
我很想知道它开始变慢的结果。
从时间的角度来看,打开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/