Эффективный способ получить данные из представления о лотосе - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь получить все данные из представления (Lotus Notes) с помощью lotusscript и Python (модуль noteslib) и экспортировать их в 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 строк, поэтому получить все данные будет слишком много времени, потому чтовручную, когда я использую File-> Export в Lotus Notes, экспорт всех данных в csv занимает около 2 минут.

И я попробовал второй способ с 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».Есть ли способ сделать это быстрее?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Открыть (или, по крайней мере, раньше) очень дорого с точки зрения времени, чтобы открыть документ 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/

0 голосов
/ 25 февраля 2019

Что-то происходит с вашим кодом «за пределами» навигации по представлению: вы уже выбрали наиболее эффективный способ навигации по представлению, используя «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)

Мне было бы очень интересно получить ваши результаты о том, где оно начинает замедляться.

...