Написание больших файлов JSON с NodeJS из MySQL - PullRequest
0 голосов
/ 29 мая 2019

В нашей базе данных MySQL есть несколько больших таблиц.Количество столбцов / строк не так велико, но каждая строка включает в себя JSON.Сейчас мы пытаемся прочитать из MySQL и сохранить его как файл JSON полностью, но этот процесс потребляет более 3 ГБ ОЗУ.Мы попробовали следующие методы:

async function cacheItems() {
  let [objs] = await db.query('SELECT o.obj_id FROM objs o;');
  for (var i in objs) {
    console.log('OBJ ' + objs[i].obj_id);
    let [rows] = await db.query('SELECT JSON_OBJECTAGG(i.title, i.details) AS result FROM items_json i WHERE i.obj_id=? AND i.details IS NOT NULL GROUP BY i.obj_id;', [objs[i].obj_id]);
    if (!rows.length) {
      continue;
    }
    fs.outputFileSync(path.join(__dirname, 'cache', 'items', objs[i].obj_id + '.json'), JSON.stringify({ data: rows[0].result, message: 'Success' }));
    delete rows;
  }
  delete objs;
}

async function cacheItems2() {
  let [objs] = await db.query('SELECT o.obj_id FROM objs o;');
  // Items
  for (var i in objs) {
    console.log('OBJ ' + objs[i].obj_id);
    var [rows] = await db.query('SELECT i.title, i.details, i.details_updated AS updated FROM items_json i WHERE i.obj_id=? AND i.details IS NOT NULL ORDER BY i.title ASC;', [objs[i].obj_id]);
    rows = rows.reduce(function (map, obj) {
      map[obj.title] = obj.details;
      return map;
    }, {});
    fs.outputFileSync(path.join(__dirname, 'cache', 'items', objs[i].obj_id + '.json'), JSON.stringify({ data: rows, status: message: 'Success' }));
    delete rows;
  }
  delete objs;
}

// Here with disabled "typeCast" so JSON will not be converted to Object.
async function cacheItems3() {
  let [objs] = await db.query('SELECT o.obj_id FROM objs o;');
  for (var i in objs) {
    console.log('OBJ ' + objs[i].obj_id);
    let [rows] = await db.query('SELECT JSON_OBJECTAGG(i.title, i.details) AS result FROM items_json i WHERE i.obj_id=? AND i.details IS NOT NULL GROUP BY i.obj_id;', [objs[i].obj_id]);
    if (!rows.length) {
      continue;
    }
    fs.outputFileSync(path.join(__dirname, 'cache', 'items', objs[i].obj_id + '.json'), '{"data": ' + rows[0].result + ', "message": "Success" }');
    delete rows;
  }
  delete objs;
}

Они оба работают хорошо, за исключением использования памяти и иногда сбоя всего процесса.

Я думал об использовании потоков, но проблема в том, чтомне нужно не только сохранить результат в файле JSON, но и обернуть его в другой объект JSON:

{ data: RESULT_HERE, message: 'Success' }

Есть ли какой-нибудь хороший способ снизить потребление памяти и достичь результата?Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...