首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中加载数据的最快方法

在Go中加载数据的最快方法
EN

Stack Overflow用户
提问于 2018-08-23 02:53:56
回答 1查看 385关注 0票数 3

我需要定期将300'000 rows x 78 columns数据加载到我的Go程序中。

我目前使用的是(**import github.com/360EntSecGroup-Skylar/excelize**):

代码语言:javascript
复制
xlsx, err := excelize.OpenFile("/media/test snaps.xlsm")
if err != nil {
    fmt.Println(err)
    return
}

//read all rows into df
df := xlsx.GetRows("data")

它需要大约4分钟在一个像样的PC使用三星960 EVO系列- M.2内置固态硬盘。

有没有更快的方法来加载这些数据?目前,读取数据比处理数据要花费更多的时间。我也可以使用其他的文件格式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 04:11:00

正如注释中所建议的,不要使用XLS格式,而是使用一种自定义的快速数据格式来读写您的表。

在最基本的情况下,只需将列数和行数写入二进制文件,然后一次性写入所有数据。这将是非常快的,我已经创建了一个小示例here,它只是将300.000 x 40 float32s写入一个文件并读回它们。在我的机器上,这需要大约400ms和250ms (请注意,文件在写入后在缓存中是热的,初始读取可能需要更长的时间)。

代码语言:javascript
复制
package main

import (
    "encoding/binary"
    "os"

    "github.com/gonutz/tic"
)

func main() {
    const (
        rowCount = 300000
        colCount = 40
    )
    values := make([]float32, rowCount*colCount)
    func() {
        defer tic.Toc()("write")
        f, _ := os.Create("file")
        defer f.Close()
        binary.Write(f, binary.LittleEndian, int64(rowCount))
        binary.Write(f, binary.LittleEndian, int64(colCount))
        check(binary.Write(f, binary.LittleEndian, values))
    }()
    func() {
        defer tic.Toc()("read")
        f, _ := os.Open("file")
        defer f.Close()
        var rows, cols int64
        binary.Read(f, binary.LittleEndian, &rows)
        binary.Read(f, binary.LittleEndian, &cols)
        vals := make([]float32, rows*cols)
        check(binary.Read(f, binary.LittleEndian, vals))
    }()
}

func check(err error) {
    if err != nil {
        panic(err)
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51973415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档