Проверить существование в ресурсе, удаление по значению





  • @DrPrime, не, ресур - это не скрытый список точно. @ruzne прав, там скорее построчная работа с файлом. В оперативку массив не грузится. Я так понимаю, что прога Penguin для работы с ключевыми словами также работает. Т.е. если у тебя в ресурсе большой файл с кучей строк, то это дело будет довольно долго обрабатываться в любом случае. И без многопотока, видимо.



  • @Antonio не я то так понял что все так может и оказаться, ведь нужно както хранить информацию о том какие строки в файле использованы, допустим если с файла берется каждая строка по одному разу, ну ладно если по проядку, можно смещение запоминать и этого достаточно будет, а если поставить мешать строки? ну всм, еще раз, как знать какие строки уже были использованы а какие нет?



  • @ruzne, можно хранить список с номерами использованных строк.



  • @Antonio еще пофантазируем, может массив обектов

    {
    Смещение от начала файла:
    Длинна строки:
    Колличество использований:
    чето еще:
    }
    


  • @ruzne @Antonio
    Файл читается полностью при старте и хранится в памяти.
    Могу предположить что все хранится одним списком, а так же для каждого хранится количество удач и неудач, а так же данные, сколько потоков используют конкретную строку



  • @DrPrime, ты пробовал в ресурс положить файл, который больше, чем у тебя оперативки?



  • @Antonio
    Да. Бас вылетает.
    Проведите експеримент
    Создайте русурс, с галочкой чтение.
    Включите запись скрипта.
    Посмотрите сколько оперативы занимает бас и воркер
    Потом в ресурсе снимиье галочку чтение, и поставьте галочку запись.
    Повторите замеры



  • @DrPrime да я действительно это и получил попарсив файл на 30+ гигов, только, на сколько я увидел файл грузится не весь сразу а последовательно, начало фала у меня удачно распарсено, позже вместо результатов идут пустые строки и так до падения

    perl рулит, 8 строк крайне тупого кода, грызут 30 Гигобайт и не чирикают.



  • @DrPrime Улучшено старое апи для работы с ресурсами.
    RMap("ИМЯ РЕСУРСА") возвращает объект, который имеет несколько полезных методов:

    //Возвращает количество элементов в ресурсе.
    length()
    
    //Получает элемент по индексу.
    at(index)
    
    //Изменяет элемент ресурса с заданным индексом.
    set(index, value)
    
    //Поиск элемента, возвращает найденный индекс или -1.
    indexOf(value)
    
    //Удалить элемент по индексу.
    remove(index)
    
    //Добавить новый элемент в ресурс.
    insert(value)
    
    //Синхронизировать ресурс, для файла - поместить все элементы ресурса в файл.
    sync()
    
    //Получить несколько разных случайных элемента из ресурса. Работает очень быстро.
    random(size)
    
    //Вернуть список, который содержит все элементы из ресурса.
    toList()
    
    //Подгрузить ресурс из файла.
    reload()
    

    Простой пример использования, вывести все элементы ресурса:

    var lines = RMap("lines")
    for(var i = 0;i<lines.length();i++)
        log(lines.at(i))
    

    Проверить, существует ли строка в ресурсе:

    var index = lines.indexOf("account1")
    if(index >= 0)
       log("Строка существует")
    else
       log("Строка не существует")
    

    Удалить элемент ресурса по значению

    var index = lines.indexOf("account1")
    lines.remove(index)
    

    Удалить элемент ресурса по значению и записать изменения в файл.

    var index = lines.indexOf("account1")
    lines.remove(index)
    lines.sync()
    

    Новое апи будет доступно в следующем билде.
    Модуль ресурсы тоже будет обновлен, но вместе с интерактивной документацией.



  • билд вышел ?



  • @Rusbear да



  • Чтобы заработало, имя ресурса бас должно быть в фигурных скобках.

    var index = {{lines}}.indexOf("account1")
    if(index >= 0)
       log("Строка существует")
    else
       log("Строка не существует")
    


  • @Rusbear
    лайн не ресурс, это объект возвращенный РМап



  • @ruzne
    Точно. Однако работает!)
    так правильнее будет:

    var lines = RMap("resurs")
    var index = lines.indexOf("znachenie")
    if(index >= 0)
       log("Строка существует")
    else
       log("Строка не существует")
    


  • Большинство методов работало, сейчас заметил, что Удалить элемент ресурса и записать изменения в файл не работают.

    Вот так не работает:

    var test = RMap("acc")
    test.remove(0)
    test.sync()
    

    даже если у ресурса есть галочка запись. Файл не изменяется.


    Когда вот так работает, даже если галочки запись нет

    _R["acc"].die()
    _R["acc"] = null
    RSync("acc")
    

    Используемая строка из ресурса удаляется.

    @support Почему так, и где я допустил ошибку?

    var test = RMap("acc")
    test.set(0, "test11")
    test.sync()
    

    Тоже не срабатывает

    Вот тестовый скрипт



  • @fox Исправил. Постараюсь побыстрее добавить новое апи в интерфейс и сделать описание всех действий из модуля "Ресурсы"



  • @support А когда, хоть приблизительно, стоит ожидать фикс?

    Ещё одну странность заметил, создал ресурс test, записал в него циклом значения [[CYCLE_INDEX]]:[[CYCLE_INDEX]].
    Вывожу в лог:

    log({{test}})           //[00:27:33] Поток №1 : 1:1
    log(RMap("test").at(0)) //[00:27:33] Поток №1 : 1:1
    

    далее изменяю первую строку в ресурсе

    var test = RMap("test") 
    test.set(0, "value")
    test.sync()
    

    вывожу в лог:

    log({{test}})           //[00:29:53] Поток №1 : 1:1
    log(RMap("test").at(0)) //[00:29:53] Поток №1 : value
    

    И получить из {{test}} value не выходит ни какими синхронизациями..
    При перезагрузки ресурса, получаем:

    log({{test}})           //[00:46:30] Поток №1 : 1:1
    log(RMap("test").at(0)) //[00:46:30] Поток №1 : 
    

    Вот тестовый скрипт.


    Странности на этом не заканчиваются.
    Если после создания ресурса не выводить значение в лог, а сразу поменять, то после замены в логе получим:

    log({{test}})           //[00:51:23] Поток №1 : value
    log(RMap("test").at(0)) //[00:51:23] Поток №1 : value
    

    Но после вывода в лог ресурса, поменять его уже не удаётся:

    var test = RMap("test") 
    test.set(0, "HE value")
    test.sync()
    

    лог:

    log({{test}})           //[00:56:05] Поток №1 : value
    log(RMap("test").at(0)) //[00:56:05] Поток №1 : HE value
    

    Вот второй скрипт



  • @fox а как можно считать список весом 10 гиг с новым апи не загружая его как список? возможно ли его чтение?
    и проверить в нем существование строки
    Я никак не догоню в чем разница апи от использования кубика список > содержит



  • @BabloUser Можешь просто прочитать файл частями в цикле и проверять на наличие в нём нужной строки. Но любом случае текстовый файл на 10 гигов будет очень медленно работать. Лучше перевести в базу.


Log in to reply