我有一些要解析的大型json文件,我想避免一次将所有数据加载到内存中。我想要一个可以一次返回每个字符的函数/循环。
我发现这个示例可以遍历字符串中的单词,而bufio包中的ScanRunes函数似乎可以一次返回一个字符。我也有ReadRune
bufio提供的功能,大多数情况下都可以正常工作,但是感觉很沉重。
我比较了3种方法。全部使用循环从bufio.Reader或bufio.Scanner中提取内容。
.ReadRune
上bufio.Reader
。检查了从到的调用是否出错.ReadRune
。bufio.Scanner
调用.Split(bufio.ScanRunes)
扫描仪后,从中读取字节。在每次迭代中调用,.Scan
并.Bytes
检查.Scan
调用是否存在错误。bufio.Scanner
使用而不是字节从a读取文本.Text
。string([]runes)
我没有使用strings.Join([]strings, "")
来连接一小段符文,而是使用来连接一小段字符串来形成文本的最终斑点。在23 MB的json文件上运行10次的时间是:
0.65 s
2.40 s
0.97 s
所以看起来ReadRune
毕竟还算不错。由于每个符文都以1个操作(.ReadRune
)而不是2(.Scan
和.Bytes
)提取,因此它也导致较小的详细调用。
只需在循环中逐一读取每个符文… 参见示例
编辑 :为后代添加代码,以防链接消失:
package main
import (
"bufio"
"fmt"
"io"
"log"
"strings"
)
var text = `
The quick brown fox jumps over the lazy dog #1.
Быстрая коричневая лиса перепрыгнула через ленивую собаку.
`
func main() {
r := bufio.NewReader(strings.NewReader(text))
for {
if c, sz, err := r.ReadRune(); err != nil {
if err == io.EOF {
break
} else {
log.Fatal(err)
}
} else {
fmt.Printf("%q [%d]\n", string(c), sz)
}
}
}
问题内容: 我在Go中找不到功能。我可以弄清楚如何快速编写一个,但是我只是想知道我是否在这里忽略了一些东西。如何逐行读取文件? 问题答案: _注意: 可接受的答案在早期的Go版本中是正确的。 包中有ReadLine函数。 请注意,如果该行不适合读取缓冲区,则该函数将返回不完整的行。如果要始终通过单次调用函数来读取程序中的整行,则需要将该函数封装到自己的函数中,该函数在for循环中进行调用。 之所以
问题内容: 在史前时代(Python 1.4)中,我们做到了: 在Python 2.1之后,我们做到了: 在Python 2.3中获得便利的迭代器协议之前,它可以做到: 我看过一些使用更详细的示例: 这是首选的方法吗? [edit]我知道with语句可以确保关闭文件…但是为什么文件对象的迭代器协议中没有包含该语句呢? 问题答案: 偏爱以下原因的确有一个原因: 我们都为CPython的相对确定性的引
Java函数都有一个严重的限制,即它的使用者不可能抛出检查过的异常。因此,我想逐个访问Stream的元素。 我想这样做: 然而,是一种短路终端操作。也就是说,它关闭了河流。这段代码会在while循环的第二次迭代中崩溃。我不能简单地将所有元素放在一个数组中,然后逐个检查该数组,因为可能有数千万个元素。 请注意,我不是在问如何从中抛出异常。这个问题已经得到了回答。
问题内容: 在Node.js中读取二进制文件的最佳方法是什么? 我正在寻找访问“标头”中的特定字节(少于前100个字节)或逐字节读取文件的方法。 问题答案: 这是-ing由以下命令返回的文件描述符的前100个字节的示例:
我想逐行读取一个文件,但不完全加载到内存中。 我的文件太大,无法在内存中打开,如果尝试这样做,我总是会出现内存错误。 文件大小为1 GB。
问题内容: 在Java 8中,我看到在Files类中添加了一个名为lines()的新方法,该方法可用于在Java中逐行读取文件。它适用于大文件吗?我的意思是我们可以先加载1000行,然后加载第二组1000行。我有1GB的大文件,能用吗? 有人可以分享代码段的用法吗? 问题答案: 它适用于大文件吗?[…]我有1GB的大文件,能用吗? 据我所知,它也应适用于大文件(但我没有尝试过): 我的意思是我们可