【发布时间】:2017-08-03 19:17:33
【问题描述】:
我想输入有关机器可用 GPU 和状态的系统信息以进行实时监控。
我正在使用XML 输出 GPU 信息
$ nvidia-smi -x -q
此命令将打印输出当前 GPU 状态(如使用情况、温度等)以及格式化的 XML(带有定义的 DTD)。 我的 XML 输出是 here。
没有直接从nvidia-smi输出到json的选项,所以这时候我看到的唯一选择就是将XML从Node.js转换成JSON。
问题是我需要它作为 JSON,所以我试图在我的 Node 应用程序中转换为 JSON。我依次使用了几个 npm 可用模块,如 xml2json、node-xml2js 等,但每个模块都有不同的错误(null、undefined 等)。
在浏览器中使用简单的 DOMParser (window.DOMParser) 可以代替。
这个 XML 似乎是一个错误,因为当我有一个像 here 这样的 GPU 输出时,JSON 转换得很好,如 gist 所示。
我正在使用 node spawn 调用nvdia-smi 命令,然后解析输出如下:
(function() {
var XMLParser = require('./xml2json');
function gpuInfo() {
var _data='';
var curl = require('child_process').spawn('nvidia-smi', ['-x','-q']);
curl.stdout.on('data', function(data) {
_data+= new Buffer(data,'utf-8').toString();
});
curl.stdout.on('end', function(data) {
var x2js = new XMLParser();
var json = x2js.xml_str2json( _data );
console.log(JSON.stringify( json,null,2));
});
curl.on('exit', function(code) {
if (code != 0) {
console.log('Failed: ' + code);
}
});
}
module.exports = {
gpuInfo:gpuInfo
}
在这种情况下,我使用的是 modified 版本的 xml2json 浏览器客户端模块和 xmldom 模块,但它似乎不是一个稳定的解决方案,所以我的解析在这里完成:
this.parseXmlString = function(xmlDocStr) {
if (xmlDocStr === undefined) {
return null;
}
var xmlDoc;
var DOMParser = require('xmldom').DOMParser;
var parsererrorNS = null;
try {
xmlDoc = new DOMParser().parseFromString( xmlDocStr, "text/xml" );
if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
xmlDoc = null;
}
}
catch(err) {
xmlDoc = null;
}
return xmlDoc;
};
离开这里
- 以 json 格式获取这些信息的另一种方式?
- 通过一些强大的 XML/JSON 解析器模块获得更有效的解决方案?
【问题讨论】: