【发布时间】:2020-09-04 22:16:30
【问题描述】:
我想在给定参数的情况下生成一个包含伪随机 ASCII 字符的大文件:每行大小和行数。如果不为每一行分配新的Strings,我无法找到一种方法。这就是我所拥有的:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=42f5b803910e3a15ff20561117bf9176
use rand::{Rng, SeedableRng};
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let mut data: Vec<u8> = Vec::new();
write_random_lines(&mut data, 10, 10)?;
println!("{}", std::str::from_utf8(&data)?);
Ok(())
}
fn write_random_lines<W>(
file: &mut W,
line_size: usize,
line_count: usize,
) -> Result<(), Box<dyn Error>>
where
W: std::io::Write,
{
for _ in 0..line_count {
let mut s: String = rand::rngs::SmallRng::from_entropy()
.sample_iter(rand::distributions::Alphanumeric)
.take(line_size)
.collect();
s.push('\n');
file.write(s.as_bytes())?;
}
Ok(())
}
我正在每行创建一个新的String,所以我认为这不是内存效率。有fn fill_bytes(&mut self, dest: &mut [u8]),但这是字节。
我最好不要为每一行创建一个新的SmallRng,但它是在循环中使用的,SmallRng 不能被复制。
如何以更节省内存和时间的方式生成随机文件?
【问题讨论】: