我需要在Go中处理一个大文件,所以我不想一次加载我的csv文件的所有行,而是按组处理它们。
为了从我离开的位置重新开始计算行,我实际上使用for cycle来跳过已经读取的行:
for idx := 0; idx < startAt; idx++ {
//Read rows and do nothing with the returned value
if _, readErr := reader.Read(); readErr != nil {
if readErr == io.EOF {
//File end -> OK
isEOF = true
break
} else {
//Read failed
return nil, errors.New(DATA_READ_ERROR)
}
}
}
这是一个非常简单的解决方案;但是,它显然是低效的。阅读第一行后,阅读以下内容的时间呈指数级增长。
为了减少这一时间,我尝试了不同的替代方案,但每种方法都无法正常工作,并使读取器失败(行不是从正确的地址读取的)。
例如,我试图返回文件指针的当前位置(使用,然后在新的迭代中,我试图使用移动指针,但它没有按预期工作。file.Seek(0, io.SeekCurrent)file.Seek(oldPosition, io.SeekStart)
有一种方法可以避免上面的循环,并在从我离开的地方重新启动时改善阅读时间?
慕桂英546537
相关分类