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



我试图用lotusscript和python和python(noteslib module)获取所有数据并将其导出到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)

要获得我花了70秒的数据,但是查看约为85000行,因此获得所有数据的时间太多了,因为当我在Lotus中使用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"的。有什么方法可以更快地做?

从时间的角度来看,它(或至少曾经是)非常昂贵,以打开注释文档,就像您在代码中所做的那样。由于您说要导出视图中显示的数据,因此可以使用DecessViewEntry类。它应该更快地

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/

在您的代码"外部"视图中正在进行某些事情:您已经选择了使用" getfirstDocument"one_answers" getNextDocument"导航视图的最性能方法。注释中提到的NotesViewNavigator会稍好一些,但并不重要。

通过设置视图,您可能会从代码中获得一点性能。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)

我会非常有兴趣让您的结果开始变得慢。

我会怀疑性能问题是使用python中的com/activex访问注释数据库。通过COM传输数据涉及数据类型"编组",可能在每个步骤,尤其是对于"未经加工"方法/属性调用。

我认为在com中没有任何方法。您应该考虑安排"代理"的笔记为您做到这一点(也许Lotusscript或Java)。即使是基本的Lotusscript代理也可以每分钟导出000的文档。另一个替代方法可能是查看笔记C-API(这不是一个简单的选择,并且需要Python的API调用)。

最新更新