EnglishУкраїнськаmRussian
Login/New
Unanswered topic

Ограничение в 100000 записей в getVals() и другие вопросы по архивам


Author Message
Written on: 28. 03. 2021 [20:00]
samsond
Dmitry Samsonov
registered since: 11.02.2020
Posts: 14
Здравствуйте!

Есть несколько вопросов по операциям с архивами средствами JavaLikeCalc.

Моя задача - организовать перенос данных из одного архива в другой.
Период следования данных в архиве - 0.00351 сек. Тип архива - на файловой системе (FSArch).
Количество записей, которые требуется перенести - около 4000000 (4 млн). Записи следуют непрерывно друг за другом.

Вопрос 1.

Попытка получить выборку вызовом

JAVASCRIPT
out = SYS.Archive["va_XXX"].getVals(startTimestamp, endTimestamp, 3510, "");


приводит к тому, что возвращается максимум 100001 запись, хотя должно быть примерно в 40 раз больше.

Прототип getVals() в исходниках имеет следующий вид (tarchval.h):

JAVASCRIPT
void TVArchive::getVals(TValBuf &buf, int64_t ibeg, int64_t iend, const string &arch, int limit = 100000, bool onlyLocal)


то есть в нем описан параметр int limit, который как раз и определяет предельное количество элементов выборки, а 100000 - значение по умолчанию.

Вопрос - можно ли как-то управлять этим параметром из JavaLikeCalc? В документации на API упоминаний нет, наивное дописывание в конец списка аргументов не сработало...


Вопрос 2.

При попытке запроса выборки, где количество элементов превышает это ограничение в 100000 элементов, получается так, что выборка выравнивается по времени окончания iend, а не начала ibeg.
Конечно, это в целом не противоречит документации, но все же такое поведение getVals() не интуитивно. А главное - не позволяет нормально вынимать данные частями в случае, если предел превышен.

Может, это ошибка?

Вопрос 3.
Не очень понятно, как работает "жесткая" и "мягкая" сетка в архиве.

В моем понимании, жесткая сетка - это когда
1) задан timestamp начала архива ibeg, его period
2) timestamp ЛЮБОГО помещенного в него значения всегда будет равен ibeg + N*period, независимо от того есть ли в архиве пропуски и пр.

Мягкая сетка - это когда условие 2) не применяется, т.е. можно поместить в архив запись с любым timestamp.

Так вот в моем архиве (он passive, если это имеет значение) выбрана мягкая сетка, но setVal помещает данные все равно как будто бы в привязке к жесткой сетке, не сильно обращая внимание на то, что передаваемый ему timestamp не соответствует условию 2).

Вопрос в том, правильно ли я понимаю что такое "мягкая" и "жесткая" сетка или же надо лучше читать документацию?

Вопрос 4.

getVals() возвращает только данные из архива, без меток времени.
как гарантировать, что выборка будет извлечена без пропусков и дублирующихся элементов, если выборка идет частями и нет возможности узнать точный timestamp каждой извлеченной записи?

Вопрос 5.
В дереве проекта есть возможность извлечь данные из архива в файл, причем, без ограничения в 100000 записей (см. скриншот ниже)
http://oscada.org/typo3temp/pics/8e7f8781e1.png

Есть ли доступ к этому функционалу через API?

Попутно: указание только одного архива за раз, а также сброс настроек экспорта после нажатия "Export" не очень удобны в использовании, когда требуется выгрузить множество архивов, особенно в привязке к единой оси времени.

[This article was edited 2 times, at last 28.03.2021 at 20:08.]
Attachment

arch.png (File type: image/png, Size: 374.24 kilobytes) — 1052 downloads



12732