В нашей базе данных 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' }
Есть ли какой-нибудь хороший способ снизить потребление памяти и достичь результата?Большое спасибо!