Бас зависает при чтении 300К строк excel



  • 100к строк еще нормально, уже 300к не вывозит



  • 6b9e8f54-7d3c-40a5-9538-a34ef252a97c-image.png

    6-7 минут потребовалось, чтобы все вгрузить



  • Фаил с 300к строками https://fex.net/ru/s/kon92af

    Процесс чтения 10 сек.

    alt text

    project_2.xml



  • @John_Bradley при записи и запуске из приложения , читает более менее быстро, но при скомпилированном, до 10 минут



  • @llimonix Скомпилировал, фаил прочитался за 10 сек.

    alt text



  • @John_Bradley видимо проблема не в excel. А в том, что потом из полученного списка, данные сохраняются в ресурс, видимо ресурсы нагружают бас. Не знаю как это исправить.
    Хотел использовать списки, но нужны чтобы они были глобальные, а так в басе почему то нельзя, рекомендовали использовать ресурсы, а ресурсы просто жрут систему при старте как не в себя. Костыли на костылях. Дельного ответа в топиках так и не дают, рекомендуют не использовать, то что отстается для меня единственным вариантом





  • @GaG это конечно классно, но все равно не то, так как в модуле список есть такие нужные функции как эти
    e53c22f2-4f4e-462b-b600-641f6e518d3b-image.png
    как это реализовать с глобальным списком через выполнить код. не понимаю от слова совсем.
    Если будут предлагать переводить в обычную переменную, изменять и потом снова в глобальную, то смысл глобальной переменной от этого пропадает, так как многопоток возьмет глобальный список без каких либо изменений, изменит его, параллельно ему изменит список и другой поток, они начнут сохранять данные и в итоге он перезапишится так, как сохранил его последний поток. Вообще то, сложная штука.

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

    f76d2e20-4319-4720-98ef-e748e6ea9352-изображение.png



  • @Fox то есть не произойдет ни в каком случае то, что 2 потока возьмут распарсят глобалку в json, изменят значение и перезапишет ее сначала первый и потом второй и данные какого-то просто потеряются? Верно понял?



  • @llimonix said in Бас зависает при чтении 300К строк excel:

    @Fox то есть не произойдет ни в каком случае то, что 2 потока возьмут распарсят глобалку в json, изменят значение и перезапишет ее сначала первый и потом второй и данные какого-то просто потеряются? Верно понял?

    Если между получением данных и записью новых будут асинхронные действия, то такая проблема обязательно произойдёт



  • @Fox пофиксить это никак? Хм



  • @llimonix said in Бас зависает при чтении 300К строк excel:

    @Fox пофиксить это никак? Хм

    Какой смысл вы вкладываете в слово "пофиксить"? Вы ведь сами создаёте логику работы скрипта, сами можете поместить между чтением и записью данных асинхронные действия ("Загрузить", "Спать" и т.д.) что и приведёт к проблеме


Log in to reply