Idiomati c способ анализа файла TSV (ASCII) - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужно проанализировать файлы, содержащие номера, разделенные табуляцией, я также знаю, что их всегда будет только два. Поскольку мои файлы могут быть размером в несколько гигабайт, я подумал, что мой текущий метод синтаксического анализа был правильным. Похоже, я мог бы сделать карту быстрее, учитывая, что у меня фиксированный размер, но я не смог найти как.

use std::io::{self, prelude::*, BufReader};

type Record = (u32, u32);

fn read(content: &[u8]) -> io::Result<Vec<Record>> {
    Ok(BufReader::new(content)
        .lines()
        .map(|line| {
            let nums: Vec<u32> = line
                .unwrap()
                .split("\t")
                .map(|s| s.parse::<u32>().unwrap())
                .collect();
            (nums[0], nums[1])
        })
        .collect::<Vec<Record>>())
}

fn main() -> io::Result<()> {
    let content = "1\t1\n\
                    2\t2\n";
    let records = read(content.as_bytes())?;
    assert_eq!(records.len(), 2);
    assert_eq!(records[0], (1, 1));
    assert_eq!(records[1], (2, 2));
    Ok(())
}

Детская площадка

1 Ответ

1 голос
/ 04 апреля 2020

Если ваши записи являются только числами, то мы можем уменьшить одно внутреннее Vec выделение в пределах map следующим образом:


use std::io::{self, prelude::*, BufReader};

type Record = (u32, u32);

fn read(content: &[u8]) -> io::Result<Vec<Record>> {
    return Ok(BufReader::new(content).lines().map(|line| {
        let line = line.unwrap();
        let mut pair = line.split("\t").map(|s|s.parse::<u32>().unwrap());
        (pair.next().unwrap(), pair.next().unwrap())
    }).collect::<Vec<Record>>())
}

fn main() -> io::Result<()> {
    let content = "1\t1\n\
                    2\t2\n";
    let records = read(content.as_bytes())?;
    assert_eq!(records.len(), 2);
    assert_eq!(records[0], (1, 1));
    assert_eq!(records[1], (2, 2));
    Ok(())
}

Возможно, вы захотите добавить лучшую обработку ошибок:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...