我现在有一个应用程序(C++)可以根据格式规范验证文件。要验证的文件可能非常大(通常为 200 MB 到 2 GB,但我也见过最大 50 GB 的文件)。对于文件访问,我现在正在使用内存映射文件,因为它既简单又快速。
我现在希望能够将其部署为一个网页,用户可以将文件拖放到其中,然后对其进行验证。由于文件大小,上传没有意义,所以我考虑直接在浏览器中验证它。
由于代码库也用于命令行应用程序和本机应用程序的库,我正在考虑验证的 WebAssembly 变体。
有没有一种有效的方法使用WebAssembly在浏览器中进行验证?到目前为止,我发现的唯一一件事是将其加载到 JS-Array 中,然后使其可用于 C++ - 但这非常慢且大小有限(至少是我这样做的方式)。对于这样的用例,推荐的方法是什么?
这不是完整的答案,因为我也在寻找可行的解决方案。但我会分享到目前为止我所拥有的。
这里是一个存储库,演示如何读取文件的第一个字节。考虑到我尝试过 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 正在提供类似的东西。