Здравствуйте, товарищи. Вопрос в следующем: В описании Искры написано (http://wiki.amperka.ru/js:iskra_js: Однако на моей Искре process.memory() выдает: У моей Искры куда-то делать память или так и должно быть ? Или я неправильно понимаю значение 5430 и это не байты, а, например, блоки ? PS: Достаточно простой запрос 2-3 Кб данных с последующим парсеньем в JSON-объект приводит к ошибке OUT OF MEMORY. Если у Искры действительно так мало оперативки, придется занятся глубокой оптимизацией своего кода.
http://www.espruino.com/Reference#l_process_memory какая версия прошивки? что за код? какого вида данные парсятся? и да, Espruino зачастую не любит обработку пухлового объема данных за раз...
Добрый день! тоже возникла проблема с памятью на 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(); }); });
так не проблема, если бы это помогало. Отправка на dweet все-равно будет при помощи библиотеки. Перед отправкой все данные формируются в буфер, тут то память и заканчивается
Почему? Там что, протокол единственный и неповторимый? Да тот же POST или GET (конечно я точно не знаю)
Kish_S, Я бы предположил, что асинхронные функции, которые вызываются в интервале, такие, как dht.read и dweet.send не успевают отработать за 1 секунду, отведенную на интервал и память забивается их экземплярами... М.б. имеет смысл попробовать кратно увеличить время интервала до, например, 10 секунд.
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 блоков закономерно не хватает Пойду переделывать свой код в линейную загрузку-выгрузку без параллельных асинхронных запросов...
Спасибо за совет. Помогает немного, но позволить себе отправлять данные раз в 10 секунд мы не можем. Проблема, действительно, с dht.read. Без этого датчика с памятью все впорядке. Но как от нее избавиться не жертвуя частотой обновления - и есть вопрос
А еще нубский вопрос: зачем у Вас два 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; }); ? Сэкономите время одного цикла опроса датчика...
Да, действительно, я уже тоже заметила и исправила в своем коде, но не стала редактировать код здесь. Спасибо