Articles of stream

如何在node.js中编写变换stream

我有一个csvparsing器实现为一系列的转换stream: process.stdin .pipe(iconv.decodeStream('win1252')) .pipe(csv.parse()) .pipe(buildObject()) .pipe(process.stdout); 我想抽象parsing器(在它自己的模块),并能够做到: process.stdin. .pipe(parser) .pipe(process.stdout); parser就是以前使用的变换stream的组合。 如果我做 var parser = iconv.decodeStream('win1252') .pipe(csv.parse()) .pipe(buildObject()); 然后parser被设置为buildObject()stream,只有这个转换stream接收数据。 如果我做 var parser = iconv.decodeStream('win1252'); parser .pipe(csv.parse()) .pipe(buildObject()); 它也不起作用,因为将在第一个变换stream上调用的是.pipe(process.stdout) ,另外两个将被绕过。 任何build议stream的优雅组成?

Node.js:如何在Write Stream“finish”事件上写入()

我使用Node.jsstream逐行扫描文本文件,进行一些转换并输出到SVG文件。 我试图在处理完成后写入最后一块数据( </svg> ),但是在写入stream发出finish事件的时候,尝试write()将抛出Error: write after end 。 有没有一种优雅的方式可以解决这个问题? 注意:input文件很大(大约1GB),所以没有经过pipe()方法,因为它的I / O和内存pipe理。 var fs = require('fs'); var split2 = require('split2'); var through2 = require('through2'); var read_stream = fs.createReadStream('input.txt'); var write_stream = fs.createWriteStream('output.svg'); write_stream.write('<svg>'); write_stream.on('finish', function() { this.write('</svg>'); // doesn't work }); read_stream .pipe(split2()) .pipe(through2.obj(function(line, encoding, next) { this.push(line); next(); })) .pipe(write_stream); 解决scheme 感谢乔丹 & pNre帮我弄明白这一点。 […]

如何stream入/从节点中的文件描述符?

fs.createReadStream()和fs.createWriteStream()只支持文件path,但是我需要从文件描述符(从subprocess传入/从subprocess)读取(或写入)。 注意我需要Streams,所以fs.open/fs.read/fs.write是不够的。

使用node.js,stream和承诺下载文件

这是我的代码片段: var processListing = function (directoryItems) { console.log('foreach'); var itemsToDownload = []; directoryItems.forEach(function (element, index, array) { //Ignore directories if (element.type === 'd') { console.log('directory ' + element.name); return; } //Ignore non zips if (path.extname(element.name) !== '.zip') { console.log('ignoring ' + element.name); return; } //Download zip itemsToDownload.push({ source: element.name, destination: element.name }); //aftpSystem.downloadFile(element.name, element.name); }); […]

nodejsstream与callback

我阅读这篇文章: http : //elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/和理解stream有一些轻微的麻烦。 引用: "Suppose we want to develop a simple web application that reads a particular file from disk and send it to the browser. The following code shows a very simple and naïve implementation in order to make this happen." 所以代码示例如下: var readStream = fileSystem.createReadStream(filePath); readStream.on('data', function(data) { response.write(data); }); readStream.on('end', function() […]

如何在Node.js中“累积”一个原始stream?

目前我把所有的东西串成一个string,如下所示 var body = ''; res.on('data', function(chunk){ body += chunk; }); 我怎样才能保留和积累的原始stream,所以我可以传递原始字节到期望字节而不是string的函数?

如何有效地计算文档stream中文档之间的相似度

我收集文本文档(在Node.js中),其中一个文档i被表示为单词列表。 考虑到新文件正在成为一种文件stream,计算这些文件之间的相似性的一种有效方法是什么? 我目前在每个文档中的单词的归一化频率上使用了cos-相似性。 由于可扩展性的问题,我不使用TF-IDF(词频,逆文档频率),因为我得到越来越多的文档。 原来 我的第一个版本是从当前可用的文档开始,计算一个大的Term-DocumentmatrixA ,然后计算S = A^T x A ,使得S(i, j) norm(doc(i))和norm(doc(j)) )文档i和j之间的词频分别为doc(i)和doc(j)之间的相似度。 对于新文件 当我得到一个新的文档doc(k)时,我该怎么办? 那么,我必须计算这个文件与以前所有文件的相似性,而不需要build立一个完整的matrix。 我可以把doc(k) dot doc(j)的内积代入前面的所有j ,并且得到S(k, j) ,这很好。 麻烦 在Node.js中计算S非常长。 实际上太长了! 所以我决定创build一个C ++模块,它可以更快地完成整个任务。 它确实! 但我不能等待它,我应该能够使用中间结果。 而我的意思是“不等它”是两个 一个。 等待计算完成,而且 湾 等待matrixAbuild立(这是一个很大的)。 计算新的S(k, j)可以利用这样的事实:文档比所有给定单词(我用来构build整个matrixA )的集合具有更less的单词。 因此,在Node.js中看起来更快,避免了大量的额外资源来访问数据。 但有没有更好的方法来做到这一点? 注意 :我开始计算S的原因是,我可以在Node.js中轻松地构buildA在那里我可以访问所有的数据,然后在C ++中进行matrix乘法,并将其返回到Node.js中,从而加快整个过程很多。 但是现在计算机不可行,看起来没用。 注2 :是的,我不必计算整个S ,我可以计算右上angular的元素(或左下angular的元素),但这不是问题。 时间计算问题不是那个顺序。

node.js中的额外stdiostream是否被child_process.spawn阻塞?

当使用spawn()创buildsubprocess时,您可以通过options.stdioparameter passing选项来创build多个stream。 在标准3(stdin,stdout,stderr)之后,你可以传递额外的stream和pipe道,这将是subprocess中的文件描述符。 然后你可以使用fs.createRead / WriteStream来访问这些。 请参阅http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options var opts = { stdio: [process.stdin, process.stdout, process.stderr, 'pipe'] }; var child = child_process.spawn('node', ['./child.js'], opts); 但是这些文件并不清楚这些pipe道堵塞的位置。 我知道标准input/标准输出/标准错误阻塞,但'pipe'呢? 一方面他们说: “请注意,父级和子级上的send()方法是同步的 – 不build议发送大块数据(可以使用pipe道,请参见child_process.spawn” 但在别处他们说: process.stderr和process.stdout不同于Node中的其他stream,写入它们通常是阻塞的。 They are blocking in the case that they refer to regular files or TTY file descriptors. In the case they refer to pipes: They […]

如何在Node.js中为非常大(> 1GB)的文件的每一行运行一个asynchronous函数

假设你有一个巨大的(> 1GB)loggingID的CSV: 655453 4930285 493029 4930301 493031 … 对于每个id您都希望进行REST API调用以获取logging数据,将其转换为本地数据,然后将其插入到本地数据库中。 你如何做到这一点与Node.js的可读Stream ? 我的问题基本上是这样的:你如何逐行阅读一个非常大的文件,为每一行运行一个asynchronous函数,并且[可选地]能够从特定行开始读取文件? 从下面的Quora问题我开始学习使用fs.createReadStream : http://www.quora.com/What-is-the-best-way-to-read-a-file-line-by-line-in-node-js var fs = require('fs'); var lazy = require('lazy'); var stream = fs.createReadStream(path, { flags: 'r', encoding: 'utf-8' }); new lazy(stream).lines.forEach(function(line) { var id = line.toString(); // pause stream stream.pause(); // make async API call… makeAPICall(id, function() { // then […]

node.js – stream文件暂时不保存

所以这是我的设置 我有一个客户端从哪个file upload到node.js服务器(serverA),从那里我想stream文件到另一台服务器(serverB), 而不临时保存文件(在serverA上)。 什么是最简单和最好的方法来实现呢? 我能够上传文件到serverA,但我不希望临时文件被存储。 更新: 它是一个简单的ajaxfile upload到(severA)…这个想法是传输字节,即使连接断开,你可以从特定的字节读回来。 我在serverA上使用express.js,而backbone.js是使用我做ajax上传的客户端。 现在A和B之间没有连接,它们通过端点进行通信。 serverA在端口4000上运行,serverB在端口5000上运行。我想以某种方式将文件从serverA传输到serverB上的端点。