小编Mal*_*ker的帖子

如何迭代(巨大)gzip 压缩文件的行?

因此,我试图对大于可用 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)

rust

8
推荐指数
1
解决办法
2528
查看次数

如果可能的话,如何进行 fftw3 MPI“转置”2D 变换?

考虑 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)

c fortran mpi fftw

4
推荐指数
1
解决办法
1222
查看次数

标签 统计

c ×1

fftw ×1

fortran ×1

mpi ×1

rust ×1