2GBの壁を突破:WebAssemblyにおける大規模ファイルの非同期I/O
2025-03-04
筆者は以前、WebAssemblyでsetjmpを実装し、WASI libcの例外処理提案への依存を回避しました。しかし、この方法は2GB未満のファイルに制限されていました。この記事では、File APIとBlob型を利用して、大規模ファイルを処理するためのメモリベースのファイルシステムを作成する方法について説明しています。WebのI/Oは非同期である一方、システム言語は通常同期であるため、Asyncifyを使用してパラダイムを橋渡ししました。wasm-optの最適化に関する問題が発生しましたが、ダミーのwasm-optを作成することで解決しました。最終的に、volatile関数ポインタを巧みに使用することで、`asyncjmp_rt_start`関数に対するAsyncifyの誤った仮定を回避し、大規模ファイルの非同期処理を実現しました。
開発