Память у Iskra JS

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Steeler, 15 янв 2018.

Метки:
  1. Steeler

    Steeler Нерд

    Здравствуйте, товарищи.

    Вопрос в следующем:

    В описании Искры написано (http://wiki.amperka.ru/js:iskra_js:
    Однако на моей Искре process.memory() выдает:
    У моей Искры куда-то делать память или так и должно быть ?
    Или я неправильно понимаю значение 5430 и это не байты, а, например, блоки ?

    PS:
    Достаточно простой запрос 2-3 Кб данных с последующим парсеньем в JSON-объект приводит к ошибке OUT OF MEMORY. Если у Искры действительно так мало оперативки, придется занятся глубокой оптимизацией своего кода.
     
  2. ИгорьК

    ИгорьК Гуру

    Там сама прошивка Espruino сидит еще
     
  3. sys

    sys Злобный Буратино Модератор

    http://www.espruino.com/Reference#l_process_memory
    какая версия прошивки? что за код? какого вида данные парсятся?
    и да, Espruino зачастую не любит обработку пухлового объема данных за раз...
     
    Последнее редактирование: 15 янв 2018
    arkadyf нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Не любит. Отправлял сообщения на телеграм - больше уже ничего в память не лезет.
     
    arkadyf нравится это.
  5. Kish_S

    Kish_S Нуб

    Добрый день! тоже возникла проблема с памятью на Iskra JS: необходимо отправлять данные со всех датчиков в dweet.io, но память утекает на глазах. Подскажите, как лучше бороться с этой проблемой(программно).

    Код (Javascript):
    var SSID = 'edc';
    var PASSWORD = '24242424';
    var NAME = 'Kishkun_graphs';
    var dweet = require('@amperka/dweetio').connect(NAME);
    var light = require('@amperka/led').connect(P13);
    light.turnOff();
    var sensor = require('@amperka/light-sensor')
    .connect(A1);
    I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
    var magnet = require('@amperka/magnetometer').connect(I2C1);
    opts = {
      sensitivity: 4 // возмоможные значения 4, 8, 12, 16
    };
    magnet.init(opts);
    var accel = require('@amperka/accelerometer').connect(I2C1);
    opts = {
      sensitivity: 2 // возмоможные значения 4, 8, 12, 16
    };
    accel.init(opts);
    var luxes = sensor.read('lx');
    var temper,rh1;
    var dht = require("DHT11").connect(P11);
    dht.read(function (a) {console.log("Temp is "+a.temp.toString()+" and RH is "+a.rh.toString());});
    function run() {
    setInterval(function() {
    dht.read(function (a) {temper = a.temp;});
    //console.log(temper);
    dht.read(function (a) {rh1 = a.rh;});
    //console.log(rh1);
    dweet.send({
       lightness: sensor.read('lx'),
       temperature:temper,
       humidity: rh1,
       magnetometer_x: magnet.get('G').x,
       magnetometer_y: magnet.get('G').y,
       magnetometer_z: magnet.get('G').z,
       accelerometer_x: accel.read('a').x,
       accelerometer_y: accel.read('a').y,
       accelerometer_z: accel.read('a').z  
    });
      print(process.memory());
    }, 1000);
    }

    var wifi = require('@amperka/wifi').setup(function(err) {
    wifi.connect(SSID, PASSWORD, function(err) {
    print('Click this link', dweet.follow());
    print(process.memory());
    run();
    });
    });
     
    upload_2018-1-16_9-55-48.png
     
  6. ИгорьК

    ИгорьК Гуру

    Способ только один - вместо библиотек писать код самому.
     
  7. Kish_S

    Kish_S Нуб

    так не проблема, если бы это помогало. Отправка на dweet все-равно будет при помощи библиотеки. Перед отправкой все данные формируются в буфер, тут то память и заканчивается
     
  8. ИгорьК

    ИгорьК Гуру

    Почему? Там что, протокол единственный и неповторимый? Да тот же POST или GET (конечно я точно не знаю)
     
  9. Steeler

    Steeler Нерд

    Kish_S,

    Я бы предположил, что асинхронные функции, которые вызываются в интервале, такие, как dht.read и dweet.send не успевают отработать за 1 секунду, отведенную на интервал и память забивается их экземплярами...

    М.б. имеет смысл попробовать кратно увеличить время интервала до, например, 10 секунд.
     
  10. Steeler

    Steeler Нерд

    sys,

    Спасибо. Т.е. все-таки блоки, что дает примерно 80 кб памяти.

    Версия прошивки 1.92.
    Код стандартный из примеров по чтению GET HTTP, приведу только часть:
    Код (C++):
        require( "http" ).get( src, function( res ) {
          var contents = { data : "" };
          res.on( 'data', function( data ) {
            contents.data += data;
          } );
          res.on( 'close', function() {
            dest.data = JSON.parse( contents.data );
            dest.time = getTime();
          } );
        } ).on( 'error', function( e ) {
          console.log( "ERROR while reading socket ", e );
          } );
    Источник (значение src в коде выше):
    http://api.openweathermap.org/data/...metric&appid=b1f6b0a1ea9e10feb04eb3a2de2ad2b9

    Посмотрел размер - там, конечно, не 2-3 кб, как я писал, а все 15 кб.
    По объему contents.data занимает порядка 2000 блоков и результат парсенья в dest.data тоже 2000 блоков.

    А т.к. это - не единственные данные в программе и не единственный цикл, то оставшейся 1000 блоков закономерно не хватает :(
    Пойду переделывать свой код в линейную загрузку-выгрузку без параллельных асинхронных запросов...
     
  11. ИгорьК

    ИгорьК Гуру

    А лучше работать с callback или промисами.
     
  12. Kish_S

    Kish_S Нуб

    Спасибо за совет. Помогает немного, но позволить себе отправлять данные раз в 10 секунд мы не можем. Проблема, действительно, с dht.read. Без этого датчика с памятью все впорядке. Но как от нее избавиться не жертвуя частотой обновления - и есть вопрос
     
    Последнее редактирование: 16 янв 2018
  13. Steeler

    Steeler Нерд

    А еще нубский вопрос:
    зачем у Вас два dht.read подряд ? Вряд ли за время чтения температуры показания влажности сильно изменились...
    Код (C++):
    dht.read(function (a) {temper = a.temp;});
    //console.log(temper);
    dht.read(function (a) {rh1 = a.rh;});
    //console.log(rh1);
    М.б. сделать так:
    Код (C++):
    dht.read(function (a) {
      temper = a.temp;
      rh1 = a.rh;
    });
     
    ?

    Сэкономите время одного цикла опроса датчика...
     
    sys нравится это.
  14. Kish_S

    Kish_S Нуб

    Да, действительно, я уже тоже заметила и исправила в своем коде, но не стала редактировать код здесь. Спасибо