代码之家  ›  专栏  ›  技术社区  ›  Luke Vo

只在浏览器专用的Javascript中读取大的JSON Blob/Stream/Buffer forward?

  •  0
  • Luke Vo  · 技术社区  · 3 年前

    我有一个JSON文件,大约800MB,我无法将其加载到内存中,即使使用 FileReader.readAsText (result属性是一个空字符串)。我认为这与此无关,但JSON文件是一个由大约350万个小对象组成的数组。请注意,该文件由用户在浏览器中拾取,并且永远不会离开浏览器。所有处理都在浏览器中进行。

    我试过了 Oboe.js 可以将输入流式传输进来,但过了一会儿就停止了。看看这个事件,我猜Oboe正在存储它解析的所有JSON对象。如果我理解正确,他们的浏览器版本也不支持流。

    有没有转发JSON的方法?我不介意没有之前的状态,类似于。网 Utf8JsonReader ?


    以下是我目前对双簧管的尝试:

        async loadAsync(file: Blob) {
            const blocks: any[] = this.blocks = [];
            
            await new Promise<void>(r => {
                const ms = Date.now();
                const url = URL.createObjectURL(file);
                let counter = 0;
    
                oboe(url)
                    .node("!.[*]", (block: any) => {
                        blocks.push(block);
    
                        counter++;
                        if (counter % 5000 == 0) {
                            this.logFn(`Loading: ${counter} items so far.`);
                        }
                    })
                    .done((fullJson: any) => {
                        debugger;
                        this.logFn(`Finished loading ${counter} blocks in ${Date.now() - ms}ms`);
                        r();
                    })
                    .fail((err: any) => {
                        console.error(err);
                        this.logFn(err);
                    });
            });
        }
    

    这适用于小文件,但对于大约25000个项目之后的大文件,存在以下错误:

    enter image description here

    0 回复  |  直到 3 年前