Мне нужно получить информацию об исходных IP-адресах и IP-адресах назначения из двоичного файла nfcapd. Проблема в размере файла. Я знаю, что нежелательно открывать и читать очень большие (более 1 ГБ) файлы с помощью пакета io или os.
Вот мой взлом и черновой старт:
package main
import (
"fmt"
"time"
"os"
"github.com/tehmaze/netflow/netflow5"
"log"
"io"
"bytes"
)
type Message interface {}
func main() {
startTime := time.Now()
getFile := os.Args[1]
processFile(getFile)
endTime := time.Since(startTime)
log.Printf("Program executes in %s", endTime)
}
func processFile(fileName string) {
file, err := os.Open(fileName)
// Check if file is not empty. If it is, then exit from program
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// Useful to close file after getting information about it
defer file.Close()
Read(file)
}
func Read(r io.Reader) (Message, error) {
data := [2]byte{}
if _, err := r.Read(data[:]); err != nil {
return nil, err
}
buffer := bytes.NewBuffer(data[:])
mr := io.MultiReader(buffer, r)
return netflow5.Read(mr)
}
Я хочу разбить файл на куски с 24 потоками и обрабатывать его одновременно после чтения с помощью netflow package. Но я не представляю, как это сделать без потери данных при делении.
Пожалуйста, исправьте меня, если я что-то упустил в коде или описании. Я трачу много времени на поиск своего решения в сети и размышляю о других возможных реализациях.
Мы будем очень благодарны за любую помощь и / или совет.
Файл имеет следующие свойства (команда file -I <file_name>
в терминале):
file_name: application/octet-stream; charset=binary
Вывод файла после команды nfdump -r <file_name>
имеет такую структуру:
Date first seen Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows
Каждое свойство находится в отдельной колонке.
ОБНОВЛЕНИЕ 1: К сожалению, невозможно проанализировать файл с помощью netflow из-за разницы в структуре двоичного файла после его сохранения на диск через nfcapd. Этот ответ дал один из nfdump участников.
Единственный способ сейчас - запустить nfdump из терминала в программе go, например pynfdump.
Еще одно возможное решение в будущем - использовать gopacket.
go Read(file)
?? Что ж, я предупреждаю вас, что ваша программа точно ничего не будет делать, функция main () завершится и все. - person Yandry Pozo   schedule 24.10.2016io
илиos
. Это именно те пакеты, которые вам нужно использовать для эффективного чтения файла, возможно, с добавлениеbufio
тоже. - person JimB   schedule 24.10.2016os
иio
. Я не могу понять, каково ваше намерение с функцией чтения, поскольку то, что вы делаете, не имеет смысла, т.е. почему вы читаете первые 2 байта дважды? Вы будете ограничены вводом-выводом на чтение файла, и если вы собираетесь обрабатывать все части одновременно, вам нужно в первую очередь загрузить их все в память. Просто прочтите файл полностью. - person JimB   schedule 25.10.2016