我试图用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调用)。