发布于 2016-01-21 12:52:24
这是斯文(NeoJSON的作者)在法老用户邮件列表上的回答(他不在SO上):
读取“格式”很容易,只需继续对每个JSON表达式执行#next (忽略空格)。
| data reader |
data := '{"smalltalk": "cool"}
{"pharo": "cooler"}'.
reader := NeoJSONReader on: data readStream.
Array streamContents: [ :out |
[ reader atEnd ] whileFalse: [ out nextPut: reader next ] ].
防止中间数据结构也很容易,使用流。
| client reader data networkStream |
(client := ZnClient new)
streaming: true;
url: 'https://github.com/NYPL-publicdomain/data-and-utilities/blob/master/items/pd_items_1.ndjson?raw=true';
get.
networkStream := ZnCharacterReadStream on: client contents.
reader := NeoJSONReader on: networkStream.
data := Array streamContents: [ :out |
[ reader atEnd ] whileFalse: [ out nextPut: reader next ] ].
client close.
data.
它花了几秒钟,它是80MB+通过网络上的50K项目毕竟。
发布于 2016-01-21 11:18:24
如果您打开一个新的ReadWriteStream,首先将${写到它上,然后将原始流的所有内容用逗号分隔到它上,然后写一个尾随的$},它会工作吗?生成的流应该对NeoJSON有好处.?这可能是对问题的STTCPW攻击,但是W是重要的;-)而且它应该更快,更少的内存消耗,因为NeoJSON只需执行一次。
只是个主意,还没试过。
发布于 2016-01-21 12:50:09
你可以试试这样的方法:
| input reader |
input := FileStream readOnlyFileNamed: 'resources/pd_items_1.ndjson.txt'.
[
Array
streamContents: [ :strm |
| ln |
[ (ln := input nextLine) isNil ]
whileFalse: [ strm nextPut: (NeoJSONReader fromString: ln) ] ] ] timeToRun.
除非这是你已经尝试过的。
https://stackoverflow.com/questions/34904337
复制相似问题