在简单的node.js应用程序中使用高内存

我做了这个简单的node.js应用程序:

var express = require('express'); var app = express(); var alasql = require('alasql'); var url = require('url'); var port = 3000; app.get('/getuser', function(request, response) { var queryObject = url.parse(request.url, true).query; var country = queryObject.country; var nameset = queryObject.nameset; var state = queryObject.state; var selectAll; if (country == "US" && state !== null && state !== "") { alasql.promise("SELECT * from JSON('database.json') WHERE Country = ? AND NameSet = ? AND State = ?", [country, nameset, state]). then(function(res) { if (res !== null && res.length > 0) { var result = res[Math.floor(Math.random() * res.length + 1)]; response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end(JSON.stringify(result)); } else { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end("noresults"); } }).catch(function(err) { console.log('Does the database.json file exists? there was an error:', err); }); } else { alasql.promise("SELECT * from JSON('database.json') WHERE Country = ? AND NameSet = ?", [country, nameset]). then(function(res) { if (res !== null && res.length > 0) { var result = res[Math.floor(Math.random() * res.length + 1)]; response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end(JSON.stringify(result)); } else { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end("noresults"); } }).catch(function(err) { console.log('Does the database.json file exists? there was an error:', err); }); } }); app.listen(port); 

正如你所看到的,我加载database.json文件,对它做一些alasql查询,并返回该数据作为响应。 database.json的大小是~50MB。 我的问题是,这个应用程序使用400-600MB的RAM!

我也做了这个版本,我使用.require打开database.json文件,但内存消耗是一样的!

 var express = require('express'); var app = express(); var alasql = require('alasql'); var url = require('url'); var port = 3000; var database = require('./database.json'); app.get('/getuser', function(request, response) { var queryObject = url.parse(request.url, true).query; var country = queryObject.country; var nameset = queryObject.nameset; var state = queryObject.state; var selectAll; if (country == "US" && state !== null && state !== "") { selectAll = alasql("SELECT * from ? WHERE Country = ? AND NameSet = ? AND State = ?", [database, country, nameset, state]); } else { selectAll = alasql("SELECT * from ? WHERE Country = ? AND NameSet = ?", [database, country, nameset]); } if (selectAll !== null && selectAll.length > 0) { var res = selectAll[Math.floor(Math.random() * selectAll.length + 1)]; response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end(JSON.stringify(res)); } else { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end("noresults"); } }); app.listen(port); 

我做错了什么,我想这是关于我的JSON文件的大小的问题? 它是55000条logging的数组,每条logging有20个字段,如果这些信息对您有帮助?

在磁盘上是50MB的事实,在比较内存时并不是特别有用。

根据数据库JSON中的内容,它可能比磁盘表示中的要大得多。

以一个整数为例,如果您的JSON中的值为5 ,那么它只占用1个字节的ASCII,但是在JavaScript中占用8个字节,因为所有数字都是8个字节。 如果考虑到跟踪JSON对象本身以及子对象所需的引用数量,则最终可能会得到比磁盘表示大得多的内容。