CSV на сегодняшний день и плавающие - PullRequest
0 голосов
/ 17 февраля 2019

В настоящее время я пишу небольшую программу, которая преобразует CSV-файлы в структуры, которые будут использоваться для дальнейшей обработки.Строки csv выглядят так:

20140102,09:30,38.88,38.88,38.82,38.85,67004

У меня 500 файлов, каждый размером около 20-30 МБ.Мой код работает просто отлично, но я не могу не задаться вопросом, нет ли лучшего способа конвертировать эти файлы, чем то, что я делаю сейчас.Сначала читаем файл и конвертируем в csv записи (псевдокод)

    data, err := ioutil.ReadFile(path)
    if err != nil {
        ... 
    }
    r := csv.NewReader(bytes.NewReader(data))
    records, err := r.ReadAll()
    if err != nil {
        ... 
    }

Затем перебираем все записи и делаем

    parsedTime, err := time.Parse("2006010215:04", record[0]+record[1])
    if err != nil {
        return model.ZorroT6{}, time.Time{}, err
    }

    t6.Date = ConvertToOle(parsedTime)
    if open, err := strconv.ParseFloat(record[2], 32); err == nil {
        t6.Open = float32(open)
    }
    if high, err := strconv.ParseFloat(record[3], 32); err == nil {
        t6.High = float32(high)
    }
    if low, err := strconv.ParseFloat(record[4], 32); err == nil {
        t6.Low = float32(low)
    }
    if close, err := strconv.ParseFloat(record[5], 32); err == nil {
        t6.Close = float32(close)
    }
    if vol, err := strconv.ParseInt(record[6], 10,32); err == nil {
        t6.Vol = int32(vol)
    }

Например, мне нужно пройти через [] byte -> string -> float64 -> float32, чтобы получить мои значения с плавающей точкой.Что я мог бы сделать, чтобы улучшить этот код?

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, мне действительно не нужно для улучшения производительности, я просто лучше пытаюсь понять Go и какую производительностьоптимизация, которая может быть применена к такой проблеме.Например, кажется, что создание загрузок строк и float64 требует больших затрат, когда у меня есть фрагмент байта и я хочу float32.

1 Ответ

0 голосов
/ 18 февраля 2019

Я вижу только одну проблему, которую нужно исправить:

Не используйте ioutil.ReadFile вместе с bytes.NewReader.Он считывает все содержимое в память, что неэффективно при большом размере файла.

Вместо этого, используйте os.Open(file), он отлично обеспечивает io.Reader, который csv.NewReader может использовать.Не забудьте закрыть файл и обработать ошибки.

Если вы все еще хотите улучшить производительность:

  1. Поскольку ваш CSV-файл имеет фиксированный формат, можно выполнить следующие действия:используя необработанные байты вместо bufio вместо csv.

  2. Вы можете скопировать и вставить базовый код в strconv и time, чтобы избежать общего кода, который не является

Но я думаю, что они не стоят хлопот.

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