Rust Polars WebAssembly CSV阅读器

lymnna71  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(225)

我有一个问题,下面当试图上传一个CSV文件,并解析它在Web汇编极使用 rust 。
谢啦,谢啦
错误:

Grid.js:498 panicked at 'unsafe precondition(s) violated: ptr::read requires that the pointer argument is aligned and non-null', C:\Users\61414\.rustup\toolchains\nightly-2022-11-20-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panicking.rs:89:58

我有下面的示例代码。
此外,我正在使用苗条作为前端,但不认为这将有多大的区别。
rust eclipse :

pub fn load_csv(&mut self, buff: &[u8]) -> String {

        let cursor = Cursor::new(buff);

        let lf = CsvReader::new(cursor).with_ignore_parser_errors(true).finish().unwrap().lazy();

        return lf.describe_plan();
    }

typescript :
只是一个函数触发时,一个文件上传到一个文件输入.

function load_csv_file(event){

        const file = event.target.files[0]

        let reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.onload = data1 => {
            console.log(data1.target.result)

            console.log(data.load_csv(new Uint8Array(data1.target.result)))
        };
    }

WASM跟踪:
不知道如何得到更好的东西

Error
    at http://localhost:5173/rustFunctions/grid/pkg/Grid.js:504:21
    at logError (http://localhost:5173/rustFunctions/grid/pkg/Grid.js:134:18)
    at imports.wbg.__wbg_new_abda76e883ba8a5f (http://localhost:5173/rustFunctions/grid/pkg/Grid.js:503:66)
    at console_error_panic_hook::Error::new::h5d7996250e9efb8e (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[154789]:0x30fc8e8)
    at console_error_panic_hook::hook_impl::h667dd0ae102fb048 (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[29585]:0x1c5c717)
    at console_error_panic_hook::hook::hc3def586df00a6f2 (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[169823]:0x31c84b3)
    at core::ops::function::Fn::call::h397369bf956b8712 (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[149254]:0x30a5529)
    at <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::hfcda8f4a283bd42a (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[125833]:0x2ee5fac)
    at std::panicking::rust_panic_with_hook::h7e6939e50e26b51d (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[914]:0x4641c8)
    at std::panicking::begin_panic_handler::{{closure}}::hfff77ccb8fcf1114 (http://localhost:5173/rustFunctions/grid/pkg/grid_bg.wasm:wasm-function[34760]:0x1e31219)

到目前为止:

  • 我已经检查了数组缓冲区不为空,方法是使用. is_empty()检查光标,并打印出与CSV解析器的[u8]数组匹配的[u8],当我在本地运行polars rust代码而不使用Wasm时,CSV解析器确实工作。
  • 正如我提到的,我在没有Wasm的本地使用了相同的Rust代码,在那里文件被正确加载。

因此,我猜测在使用WASM时,光标创建或传递到极坐标时会出现问题,但这只是一个猜测。

ekqde3dh

ekqde3dh1#

您可以参考'js-polars实现。
一般来说,当把rust函数暴露给JS时,你应该使用wasm-bindgen或者通过extern "C"函数使用ffi。wasm-bindgen比手动处理内存和指针要容易得多。
还有一些需要注意的事项:
如果要处理大型数据集,您可能会遇到wasm & rust的最大内存限制。您可以通过更新.cargo/config.toml来修改它
启动一个Web工作线程池来解析CSV也会有很大的开销,您需要在一个工作线程池中运行parse_csv函数。@polars/browser npm包在很大程度上简化了这一点,您可以查看其中关于如何在浏览器中运行polars的一些指导方针。

相关问题