Бас зависает при чтении 300К строк excel
-
100к строк еще нормально, уже 300к не вывозит
-
6-7 минут потребовалось, чтобы все вгрузить
-
-
@John_Bradley при записи и запуске из приложения , читает более менее быстро, но при скомпилированном, до 10 минут
-
@llimonix Скомпилировал, фаил прочитался за 10 сек.
-
@John_Bradley видимо проблема не в excel. А в том, что потом из полученного списка, данные сохраняются в ресурс, видимо ресурсы нагружают бас. Не знаю как это исправить.
Хотел использовать списки, но нужны чтобы они были глобальные, а так в басе почему то нельзя, рекомендовали использовать ресурсы, а ресурсы просто жрут систему при старте как не в себя. Костыли на костылях. Дельного ответа в топиках так и не дают, рекомендуют не использовать, то что отстается для меня единственным вариантом
-
-
@GaG это конечно классно, но все равно не то, так как в модуле список есть такие нужные функции как эти
как это реализовать с глобальным списком через выполнить код. не понимаю от слова совсем.
Если будут предлагать переводить в обычную переменную, изменять и потом снова в глобальную, то смысл глобальной переменной от этого пропадает, так как многопоток возьмет глобальный список без каких либо изменений, изменит его, параллельно ему изменит список и другой поток, они начнут сохранять данные и в итоге он перезапишится так, как сохранил его последний поток. Вообще то, сложная штука.Читал в топиках, говорят работать с бд баса, но я не совсем до конца понял, если я передаю свой скомпилированный софт (BAS Premium) другому человеку, то как он будет использовать его, если бд локально создалась у меня в appdata/local и нету возможности создать ее у него на компьютере и все данные из списка. Да и смотрел ролик Павла Дугласа, он говорил об ограничение в 10К (или 1К не помню) строк, но ролик старый, не знаю как обстоят с этим дела сейчас
Вообщем то , заключение то, что нам нужна поддержка глобальных списках в модуле Список. Я бы ее реализовал, если бы знал как :)
-
@llimonix Надо было и начать с того, что проблема в построении логики вашего скрипта, а не в считывании и записи в excel вовсе. Указать на проблему и приложить скрипт. На платной основе многие бы откликнулись решить вопрос.
-
@llimonix said in Бас зависает при чтении 300К строк excel:
Вообщем то , заключение то, что нам нужна поддержка глобальных списках в модуле Список. Я бы ее реализовал, если бы знал как :)
https://community.bablosoft.com/topic/4681/список-в-глобальной-переменной
-
@Fox а как из него удалять по значению?
-
@llimonix said in Бас зависает при чтении 300К строк excel:
@Fox а как из него удалять по значению?
Вы бы заглянули под капот и увидели бы, что глобальная переменная хранит данные в json строке:
log(JSON.parse(P("basglobal", "GLOBAL_LIST") || '""')[0])
Значит вам нужно из json строки получить массив, изменить его, перевести массив в json и залить обратно изменённую json строку. Реализовать это в коде или кубиками - без разницы. Так как работа с глобальными переменными в BAS потоки выполняют синхронно (два потока не могут изменить одну переменную одновременно).
Для вашего успокоения можно создать тестовый скрипт для проверки работы. Поток сохраняет глобальный список в локальную переменную, затем создаёт случайную строку и сохраняет её в список по индексу - номеру потока. Изменённый список после этого сохраняет обратно в глобальную переменную и через случайное время происходит сравнение, если случайная строка в потоке отличается от данных из глобальной переменной, то скрипт аварийно завершается.
Тестовый скрипт: 2414.xml
Скрипт в 100 потоков, при постоянной одновременной записи в одну глобальную переменную работает корректно
-
@Fox то есть не произойдет ни в каком случае то, что 2 потока возьмут распарсят глобалку в json, изменят значение и перезапишет ее сначала первый и потом второй и данные какого-то просто потеряются? Верно понял?
-
@llimonix said in Бас зависает при чтении 300К строк excel:
@Fox то есть не произойдет ни в каком случае то, что 2 потока возьмут распарсят глобалку в json, изменят значение и перезапишет ее сначала первый и потом второй и данные какого-то просто потеряются? Верно понял?
Если между получением данных и записью новых будут асинхронные действия, то такая проблема обязательно произойдёт
-
@Fox пофиксить это никак? Хм
-
@llimonix said in Бас зависает при чтении 300К строк excel:
@Fox пофиксить это никак? Хм
Какой смысл вы вкладываете в слово "пофиксить"? Вы ведь сами создаёте логику работы скрипта, сами можете поместить между чтением и записью данных асинхронные действия ("Загрузить", "Спать" и т.д.) что и приведёт к проблеме