Tag: 大文件

Nodejs createReadStream只读取大型JSON文件的一个数据块

我正在使用Nodejs从一个非常大的JSON文件(1GB +)中读取JSON对象。 JSON文件格式为[{field1:x,field2:x,field3:x},{…},…,{…}]。 每个对象都没有行分隔。 为了避免内存问题,我正在使用fs.createReadStream并按顺序处理每个数据块。 这工作,我得到有效的JSON对象,但读者只读一个数据块后停止。 为什么不读取文件的其余部分? 我的解决scheme受到了这个问题中被接受的答案的启发: 在Nodejs中parsing大的JSON文件 这里是代码: // Get the JSON file var fs = require('fs'); var stream = fs.createReadStream('Results.json', {flags: 'r', encoding: 'utf-8'}); var buf = ''; var count = 0; stream.on('data', function(chunk) { console.log("Stream on data!"); // ONLY EXECUTED ONCE buf += chunk.toString(); // when data is read, stash it […]

Nodejs读取非常大的文件(〜10GB),逐行处理然后写入其他文件

我有一个特殊格式的10 GB日志文件,我想逐行处理这个文件 ,然后在输出一些转换之后把输出写到其他文件中 。 我正在使用节点进行此操作。 虽然这个方法很好,但是这样做需要很多时间。 我可以在JAVA 30-45分钟内做到这一点,但是在节点上做同样的工作需要160分钟以上。 以下是代码: 以下是从input读取每行的启动代码。 var path = '../10GB_input_file.txt'; var output_file = '../output.txt'; function fileopsmain(){ fs.exists(output_file, function(exists){ if(exists) { fs.unlink(output_file, function (err) { if (err) throw err; console.log('successfully deleted ' + output_file); }); } }); new lazy(fs.createReadStream(path, {bufferSize: 128 * 4096})) .lines .forEach(function(line){ var line_arr = line.toString().split(';'); perform_line_ops(line_arr, line_arr[6], line_arr[7], […]

如何知道一个文件中的行数,而无需将其内容加载到JavaScript中的内存?

简要: 一个将加载CSV文件的系统,但预计会很大 (+ 1M行)。 我已经知道如何使用队列和后台作业/任务来处理它们。 但, 我想向用户显示他的文件中的进度,如下所示: 1246875的2165或者百分比。 要存档这个,我需要知道文件中的行数,但是我不得不将它的内容加载到内存中,所以它可以很快,只要我上传,可以保存文件中的文件在其中find了全部的行。 在PHP中,这可能使用SplFileObject试图seek()到PHP_MAX_INT ,然后它到达它可以在文件中的最高行, key()返回该行。 但是这个系统是完全用JavaScript / Node.js构build的,所以为了方便,我想用JavaScript来构build这个系统部分。 我怎么能做到这一点? 已经看过FS API了 ,但没有find如何去做到这一点。 [编辑] 迄今为止的想法: child_process.exec + wc -l (仅适用于Unix) 使用FileReader从客户端获取此信息(将资源委托给用户)

随机访问node.js中的大文件(需要支持64位文件偏移量)?

我正在考虑将部分跨平台脚本移植到node.js,部分是因为我现在更熟悉JavaScript,部分原因是由于其他脚本语言对大文件支持的问题。 某些脚本语言似乎对大文件偏移量有补丁支持,这取决于它们是在32位/ 64位操作系统还是处理器上运行,还是需要使用特定标志进行特定编译。 所以我想用node.js来试验,不过谷歌search对于64位偏移量的大文件我没有find任何支持它的方法(或者是库/框架支持等)。 我意识到在某种程度上,这至less取决于JavaScript的底层整数支持。 如果我正确地阅读什么是JavaScript的Max Int? 一个数字可以达到的最高整数值是什么? 看起来JavaScript在内部使用浮点,即使是整数也是如此 最大的确切积分值是2 53 然后,再次node.js是为服务器和服务器应该期望大文件的支持。 node.js是否支持64位文件偏移量? UPDATE 尽pipe_LARGEFILE_SOURCE和_FILE_OFFSET_BITS构build标志,现在我已经开始移植我的项目,需要这个,我发现fs.read(files.d.fd, chunk, 0, 1023, 0x7fffffff, function (err, bytesRead, data)成功,但0x80000000与EINVAL失败。这是在32位Windows 7上运行的版本v0.6.11 。 到目前为止,我不确定这是否仅限于fs的限制,node.js中的错误,还是仅在Windows上构build的问题。 是否打算在所有平台的所有核心模块中的node.js中使用大于31位的文件偏移量?

在NodeJS中使用stream和asynchronous读取和处理大小文件

我在逐行处理文件列表时遇到问题。 这是我正在使用的代码: var LineReader = require("line-by-line"); var async = require("async"); var files = [ "small.txt", "medium.txt", "large.txt" ]; var queue = async.queue(function(task, next){ console.log(task); next(); }, 10); async.eachSeries( files, function (file, callback) { var lineReader = new LineReader(file, { encoding: "utf8", skipEmptyLines: true }); lineReader.on("error", function (err) { callback(err); }); lineReader.on("line", function (line) { lineReader.pause(); […]

Node.js readStream结束大文件

我想在电子邮件通知中偶尔发送大型日志文件(> 100MB)的最后2KB。 现在,我正在尝试以下内容: var endLogBytes = fs.statSync(logFilePath).size; var endOfLogfile = fs.createReadStream(logFilePath, {start: endLogBytes-2000, end: endLogBytes – 1, autoClose: true, encoding: 'utf8'}); endOfLogfile.on('data', function(chunk) { sendEmailFunction(chunk); } 由于我刚刚重新启动,我的日志文件只有〜2MB,但随着他们变大,我想知道: 1)读取数据是否需要很长时间(节点是否遍历整个文件,直到它到达我想要的字节,或节点跳到我想要的字节?) 2)消耗多less内存? 3)内存空间何时释放? 如何释放内存空间?

将一个大文件追加到nodejs中的其他大文件中

我正在使用电子框架(primefaces壳)的应用程序,我是新的NodeJS。 这通过在http获取请求中指定字节范围,将大文件下载为两个(或多个)片段(每个大于2GB)。 完成后,我想结合这两个文件。 直到现在我已经能够想到一个解决scheme,打开这两个文件,并使用fs.appendFile附加第二个文件的块到第一个。 在我看来,这将是一个非常缓慢的过程,也会阻止nodejs。 有没有其他有效的方法。 我也愿意产生一个subprocess,并使用其他一些应用程序。

在大文件加载时将内存不足处理成mongo

我试图保存和parsing大的.csv文件,并保存在MongoDB中的数据,保持结果stringtypes。 所以我试图通过parsing器pipe道.csv文件数据,然后将数据写入MongoDB。 我试着将.csvparsing为一个json文件并使用mongoimport将其上传到MongoDB,但是这些值并没有保存为string,而且在使用mongoimport时不能设置值。 我也不想为节点设置内存,尽量使用尽可能less的内存。 我现在的问题是:程序耗尽内存并抛出: 致命错误:CALL_AND_RETRY_LAST分配失败 – 进程内存不足 var fs = require('fs'); var parse = require('csv-parse'); var async = require('async'); var queue, stream; var headers = fileData.subText.meta.fields; MongoClient.connect(url, function (err, db) { if (err) throw err; var collection = db.collection(fileData.collectionName); var parser = parse({columns: fileData.subText.meta.fields, delimiter: fileData.delimiter}); stream = fs.createReadStream("filepath" + fileData.name).pipe(parser); var data; queue […]

Node.js 1gb csvfile upload – 错误:请求中止

我有一个大file upload的问题。 我试图上传较小的文件,它的工作很好,但是当我尝试上传较大的文件(700MB和更多)时,node.js服务器给我一个错误: Error: Request aborted at IncomingMessage.onReqAborted (/home/xxx/node_modules/express/node_modules/connect/node_modules/multiparty/index.js:131:17) at IncomingMessage.EventEmitter.emit (events.js:92:17) at abortIncoming (http.js:1911:11) at Socket.serverSocketCloseListener (http.js:1923:5) at Socket.EventEmitter.emit (events.js:117:20) at TCP.close (net.js:465:12) 它甚至没有达到阅读状态。 我用 谷歌浏览器 expression3.0 我已经包括在内 app.use(express.bodyParser({limit: '2048mb'})); 另外我想我应该提到这一点; 得到上述错误后,文件开始再次上传失败。 再次,小文件没有问题。 所以我的问题是我怎样才能有效地使用这种方法stream大文件,或者有更好的方法来做到这一点? 谢谢。

用Node.js编写大文件

我正在用node.js写一个使用可写入stream的大文件: var fs = require('fs'); var stream = fs.createWriteStream('someFile.txt', { flags : 'w' }); var lines; while (lines = getLines()) { for (var i = 0; i < lines.length; i++) { stream.write( lines[i] ); } } 我想知道如果这个scheme是安全的,而不使用drain事件? 如果不是的话(我认为是这种情况),将任意大数据写入文件的模式是什么?