从Lotus Notes视图获取数据的有效方法

时间:2019-02-22 10:48:44

标签: python lotus-domino lotusscript

我正在尝试使用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”。有什么方法可以更快地做到这一点?

2 个答案:

答案 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/