因此,我试图对大于可用 RAM 的 gz 压缩文件执行某种面向行的操作,因此排除首先将其读入字符串的情况。问题是,如何在 Rust 中做到这一点(缺少gunzip file.gz|./my-rust-program)?
我当前的解决方案基于flate2一堆缓冲读取器:
use std::path::Path;
use std::io::prelude::*;
use std::io::BufReader;
use std::fs::File;
use flate2::bufread::GzDecoder as BufGzDecoder;
fn main() {
let mut fname = "path_to_a_big_file.gz";
let f = File::open(fname).expect("Ooops.");
let bf = BufReader::new(f); // Here's the first reader so I can plug data into BufGzDecoder.
let br = BufGzDecoder::new(bf); // Yep, here. But, oops, BufGzDecoder has not lines method,
// so try to stick it into a std BufReader.
let bf2 = …Run Code Online (Sandbox Code Playgroud) 考虑 L x M(列主设置)形式的 2D 变换,从复杂数组src到实数数组tgt。或者,用 Fortranese 语言来说,
complex(C_DOUBLE_COMPLEX), pointer :: src(:,:)
real(8), pointer :: tgt(:,:) .
Run Code Online (Sandbox Code Playgroud)
对应的指针是
type(C_PTR) :: csrc,ctgt .
Run Code Online (Sandbox Code Playgroud)
我会按以下方式分配它们:
! The complex array first
alloc_local = fftw_mpi_local_size_2d(M,L/2+1,MPI_COMM_WORLD,local_M,local_offset1)
csrc = fftw_alloc_complex(alloc_local)
call c_f_pointer(csrc, src, [L/2,local_M])
! Now the real array
alloc_local = fftw_mpi_local_size_2d(2*(L/2+1),M, &
MPI_COMM_WORLD,local_L,local_offset2)
ctgt = fftw_alloc_real(alloc_local)
call c_f_pointer(ctgt, tgt, [M,local_L])
Run Code Online (Sandbox Code Playgroud)
现在,该计划将创建为:
! Create c-->r transform with one transposition left out
plan = fftw_mpi_plan_dft_c2r_2d(M,L,src,tgt, MPI_COMM_WORLD, &
ior(FFTW_MEASURE,FFTW_MPI_TRANSPOSED_OUT))
Run Code Online (Sandbox Code Playgroud)
最后,变换将执行为:
call fftw_mpi_execute_dft_c2r(plan, src, tgt) …Run Code Online (Sandbox Code Playgroud)