Можно ли заполнить большой набор во время компиляции? - PullRequest
3 голосов
/ 10 марта 2019

У нас есть функция «удалить все мои данные».Я хотел бы удалить набор IP-адресов из множества файлов веб-журналов.

В настоящее время во время выполнения я открываю CSV с IP-адресами для удаления, превращаю его в набор, сканирую файлы и выполняюУдалите логику, если IP-адреса журнала совпадают.

Есть ли способ загрузить CSV и превратить его в набор во время компиляции?Мы пытаемся перенести вещи в лямбда-сервис AWS, и было бы неплохо иметь только один статический двоичный файл для развертывания без каких-либо зависимостей.

Ответы [ 3 ]

4 голосов
/ 10 марта 2019

Ящик Rust-PHF предоставляет структуры данных времени компиляции, включая (упорядоченные) карты и наборы.

К сожалению, на сегодняшний день он не поддерживает инициализацию набора std::net::IpAddr, но может использоваться со статическими строками:

static IP_SET: phf::Set<&'static str> = phf_set! {
    "127.0.0.1",
    "::1",
};
2 голосов
/ 10 марта 2019

имеет только один статический двоичный файл для развертывания

Вставьте весь ваш CSV-файл, используя include! или include_str!, а затем выполните обычную работу с остальной частью вашей программы.

use csv; // 1.0.5

static CSV_FILE: &[u8] = include_bytes!("/etc/hosts");

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rdr = csv::ReaderBuilder::new()
        .delimiter(b'\t')
        .from_reader(CSV_FILE);

    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

Смотри также:

2 голосов
/ 10 марта 2019

Я бы порекомендовал просто использовать Build Script , чтобы прочитать CSV и создать исходный файл, содержащий инициализированный стандарт HashSet с пользовательским хэшем (например, FxHash).

Это позволит вам сохранить удобство редактирования файла CSV, сохраняя при этом все данные в двоичном виде. Это потребовало бы некоторого времени инициализации (в отличие от PHF), но возможность указать собственный хэш весьма полезна.

Также, в зависимости от формата IP-адресов в журналах, вы можете сохранить либо &'static str, либо u32; последний более эффективен (с точки зрения поиска), но усиление может быть сведено на нет, если требуется преобразование.

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