如何在浏览器中处理WebAssembly中的大文件?

问题描述 投票:0回答:1

我现在有一个应用程序(C++)可以根据格式规范验证文件。要验证的文件可能非常大(通常为 200 MB 到 2 GB,但我也见过最大 50 GB 的文件)。对于文件访问,我现在正在使用内存映射文件,因为它既简单又快速。

我现在希望能够将其部署为一个网页,用户可以将文件拖放到其中,然后对其进行验证。由于文件大小,上传没有意义,所以我考虑直接在浏览器中验证它。

由于代码库也用于命令行应用程序和本机应用程序的库,我正在考虑验证的 WebAssembly 变体。

有没有一种有效的方法使用WebAssembly在浏览器中进行验证?到目前为止,我发现的唯一一件事是将其加载到 JS-Array 中,然后使其可用于 C++ - 但这非常慢且大小有限(至少是我这样做的方式)。对于这样的用例,推荐的方法是什么?

webassembly emscripten
1个回答
0
投票

这不是完整的答案,因为我也在寻找可行的解决方案。但我会分享到目前为止我所拥有的。

这里是一个存储库,演示如何读取文件的第一个字节。考虑到我尝试过 1GB 文件并几乎立即得到结果,我认为它没有将整个文件上传到浏览器。

此外,我很确定您现在已经听说过由 Origin 私有文件系统支持的浏览器中的 SQLite Wasm。这应该更重要,因为 SQLite 是用 C++ 编写的。

根据我(有限)的理解,一旦你有了一个 FileHandle(无论是来自 OPFS、FileInput 还是其他),其余的都是一样的。因此,无论您是拖放、使用文件上传还是从 OPFS 读取(我的目标),上述解决方案都应该有效。

本质上,在示例存储库中,文件句柄被传递给工作人员(它通过

fileHandle.createSyncAccessHandle

具有同步访问权限)

document.getElementById("file_picker").addEventListener( "change", function() { let file = this.files[0]; myWorker.postMessage({ file: file, offset: BigInt(0) });
工人正在使用手柄

onmessage = async function(e) { let workerResult = read_at_offset_sync( e.data.file, e.data.offset, ); postMessage(workerResult); };

read_at_offset_sync

 是 Rust 中的一个函数,它使用 web_sys crate/bridge 读取文件。我的另一个假设是 emscripten 正在提供类似的东西。

© www.soinside.com 2019 - 2024. All rights reserved.