【问题标题】:Efficient way to get data from lotus notes view从 Lotus Notes 视图获取数据的有效方法
【发布时间】:2019-02-22 10:48:43
【问题描述】:

我正在尝试使用 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”。有什么方法可以更快吗?

【问题讨论】:

  • 如果您使用的是 LotusScript,我建议您使用 NotesViewNavigator。这非常有效,但我不知道Python模块是否有类似的东西。 Fwiw,这是NotesViewNavigator 上的文档:ibm.com/support/knowledgecenter/en/SSVRGU_9.0.1/basic/…
  • 感谢您的回复。在 Python 中,我可以使用 LotusNotes 中的每个 COM 类。我尝试使用NotesViewNavigator,问题是时间与其他方法类似。也许这是正常的,我期望太高了?这是我的代码:db = noteslib.CurrentDatabase view = db.GetView('My view') nav = view.CreateViewNav() doc = nav.GetFirst() view.AutoUpdate = False list_of_data = [] for i in range(1000): list_of_data.append(doc.ColumnValues) doc = nav.Getnext(doc) 获取 1000 行数据大约需要 146 秒。
  • 您的代码在哪里运行?直接在 Domino 服务器上还是在客户端上?
  • 我是 Domino 客户端的普通用户,我的 IT 团队告诉我们,他们不会创建代理来为我们获取数据。所以我想自己做,我没有Domino服务器的权限。
  • 那我建议本地复制数据库..

标签: python lotus-domino lotusscript


【解决方案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/

【讨论】:

    【解决方案2】:

    您的代码“在视图导航之外”发生了一些事情:您已经选择了使用“GetFirstDocument”和“GetNextDocument”来导航视图的最高效方式。使用 cmets 中提到的 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)
    

    我很想知道你的结果是什么地方开始变慢。

    【讨论】:

    • 感谢您的回复!我尝试了你的想法,但我仍然不知道是什么问题。在循环中只有doc = view.GetNextDocument(doc) 时,100 行需要 6 秒,1000 行需要 39 秒。附加是 7s 和 66s。在我看来,这种差异是由于列的数量。但是 1000 行仍然需要 39 秒,大约需要 55 分钟才能从数据库视图(85 000 行)中获取所有数据。
    【解决方案3】:

    我怀疑性能问题是在 Python 中使用 COM/ActiveX 来访问 Notes 数据库。通过 COM 传输数据涉及数据类型“编组”,可能在每个步骤中,尤其是对于“进程外”方法/属性调用。

    我认为在 COM 中没有办法解决这个问题。您应该考虑安排一个 Notes“代理”来代替您执行此操作(可能是 LotusScript 或 Java)。即使是基本的 LotusScript 代理也可以每分钟导出 000 个文档。另一种选择可能是查看 Notes C-API(不是一个简单的选择,需要从 Python 调用 API)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      相关资源
      最近更新 更多