我需要定期将300'000 rows x 78 columns数据加载到我的Go程序中。
我目前使用的是(**import github.com/360EntSecGroup-Skylar/excelize**):
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内置固态硬盘。
有没有更快的方法来加载这些数据?目前,读取数据比处理数据要花费更多的时间。我也可以使用其他的文件格式。
发布于 2018-08-23 04:11:00
正如注释中所建议的,不要使用XLS格式,而是使用一种自定义的快速数据格式来读写您的表。
在最基本的情况下,只需将列数和行数写入二进制文件,然后一次性写入所有数据。这将是非常快的,我已经创建了一个小示例here,它只是将300.000 x 40 float32s写入一个文件并读回它们。在我的机器上,这需要大约400ms和250ms (请注意,文件在写入后在缓存中是热的,初始读取可能需要更长的时间)。
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)
}
}https://stackoverflow.com/questions/51973415
复制相似问题