msgpack занимает 20 секунд, чтобы десериализовать 180 МБ данных - PullRequest
0 голосов
/ 06 марта 2020

Я новичок в rust & msgpack, поэтому подумал, что я увижу, ожидается ли это ожидаемая производительность и есть ли какие-нибудь значительно более быстрые способы использования этого ящика. У меня есть файл (это данные геолокации из базы данных Maxmind CSV). Это примерно 180 МБ. Мне нужно иметь возможность десериализовать данные как можно быстрее и, если возможно, гораздо быстрее, чем за секунду.

Это примерно то, что я делаю, я убрал все посторонние вещи.

#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Record {
    network: String,
    geoname_id: String,
    registered_country_geoname_id: String,
    represented_country_geoname_id: String,
    is_anonymous_proxy: String,
    is_satellite_provider: String,
    postal_code: String,
    latitude: String,
    longitude: String,
    accuracy_radius: String
}

fn main() -> std::io::Result<()> {
    let f = File::open("src/ips.csv")?; // maxmind geolite ipv4 database ~180mb
    let mut r = csv::Reader::from_reader(BufReader::new(f));

    let mut records = Vec::new();
    for result in r.deserialize() {
        let record: Record = result?;
        records.push(record);
    }

    let buf = rmp_serde::to_vec(&records).unwrap();

    let now = Instant::now();
    let values: Vec<Record> = rmp_serde::from_read_ref(&buf).unwrap();
    println!("time {}", now.elapsed().as_secs());

    Ok(())
}

Я также выбросил buf в файл для его допроса. Это ~ 180мб. Что я думал, будет меньше с пакетом сообщений?

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