我希望根据每行大小和行数的参数生成一个大的伪随机ASCII字符文件,但我想不出一种方法,在不为每行分配新的字符串的情况下实现。以下是我的代码: 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
不能被复制。如何以更加内存和时间高效的方式生成随机文件?
Vec
中,而不是写入文件,这就解决了问题。 - MakotoE