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

问题描述 投票:1回答:2

我试图通过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”。有没有办法更快地做到这一点?

python lotus-domino lotusscript
2个回答
1
投票

您的代码在视图导航“外部”进行了一些操作:您已经选择了使用“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)

我很想知道它开始变慢的结果。


1
投票

从时间的角度来看,打开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/

© www.soinside.com 2019 - 2024. All rights reserved.