在Go中用小RAM读取大文件的最快方法[关闭]

2023-11-23

我想从不同的文本或JSON or CSV文件。我应该遵循哪种方法?

我有博客文章文件读取 and 使用小 RAM 读取 2 GB 文本文件文件读取的不同方法。

不同的方法:

  • 分块读取文件
  • 同时读取文件块
  • 将整个文件读入内存
  • 将长字符串拆分为单词
  • 逐字扫描

用小内存读取文件最快的方法是什么?


解析文件基本上有两种不同的方法:文档解析和流解析。

文档解析从文件中读取数据并将其转换为可以查询的一大组对象,例如 HTMLDOM在浏览器中。优点是您可以轻松获得完整的数据,这通常更简单。缺点是你必须将其全部存储在内存中。

dom = parse(stuff)

// Now do whatever you like with the DOM

相反,流解析一次读取一个元素并将其呈现给您立即使用,然后继续处理下一个元素。

for element := range stream(stuff) {
    ...examine one element at a time...
}

优点是您不必将整个内容加载到内存中。缺点是您必须随时处理数据。这对于搜索或任何其他需要一一处理的事情非常有用。


幸运的是,Go 提供了库来为您处理常见格式。

一个简单的示例是处理 CSV 文件。

package main

import(
    "encoding/csv"
    "fmt"
    "log"
    "os"
    "io"
)

func main() {
    file, err := os.Open("test.csv")
    if err != nil {
        log.Fatal(err)
    }

    parser := csv.NewReader(file)

    ...
}

我们可以将整个事情作为一个大的事件放入内存中[][]string.

records, err := parser.ReadAll()
if err != nil {
    log.Fatal(err)
}

for _,record := range records {
    fmt.Println(record)
}

或者我们可以节省一堆内存并一次处理一行。

for {
    record, err := parser.Read()
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(record)
}

由于 CSV 的每一行在功能上都是相同的,因此一次处理一行最有意义。

JSON 和 XML 更复杂,因为它们是大型嵌套结构,但它们也可以流式传输。有编码/json文档中的流式传输示例.


如果您的代码不是简单的循环怎么办?如果您想利用并发性怎么办?使用通道和 goroutine 使其与程序的其余部分同时运行。

records := make( chan []string )
go func() {
    parser := csv.NewReader(file)

    defer close(records)
    for {
        record, err := parser.Read()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        records <- record
    }
}();

现在你可以通过records到可以处理它们的函数。

func print_records( records chan []string ) {
    for record := range records {
        fmt.Println(record)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Go中用小RAM读取大文件的最快方法[关闭] 的相关文章

  • 在 Python 中搜索文本文件并打印相关行?

    如何在文本文件中搜索关键短语或关键字 然后打印关键短语或关键字所在的行 searchfile open file txt r for line in searchfile if searchphrase in line print line
  • GORM中的一对多递归关系

    我需要有一个Organization与父级有关系 像这样的事情 type Organization struct gorm Model Parent Organization gorm ForeignKey ParentId Name st
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 将变量写入 Ansible 中的文件

    我通过 URI 模块提取 JSON 并希望将接收到的内容写入文件 我能够获取内容并将其输出到调试器 因此我知道已收到内容 但我不知道写入文件的最佳实践 来自的重要评论tmoschou https stackoverflow com user
  • React 文件预览 (FIREBASE)

    我目前将文件存储在 Firebase 存储中 我希望能够实时生成每个文件的文件预览 映射 例如 PDF 文件会将第一页显示为图像 docx 将是文档的第一页 pptx 将是第一张幻灯片 未知文档将是默认文档符号 有人知道有什么好的服务可以轻
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 与 Reflect.StructTag.Get 不兼容

    我当时在 Google Cloud 中工作 一切都很好 但是当我在 PC 中克隆所有项目时 每个 JSON 结构中都有此消息 结构体字段标签bson edad json edad omitempty 与reflect StructTag G
  • C++中不规则文件写入性能

    我正在编写一个应用程序 它通过简单的函数调用接收二进制数据流 例如put DataBLock dateTime 其中每个数据包为 4 MB 我必须将这些数据块写入单独的文件 以供将来与一些附加数据 如 id 插入时间 标签等 一起使用 所以
  • Laravel 文件下载 - php_fileinfo 扩展未启用

    我正在使用 Laravel 5 4 13 和 PHP 7 1 并迁移到共享主机 我正在尝试使该网站正常运行 但由于缺少扩展名而无法正常运行 php fileinfo 这是网站崩溃的代码 file base path storage app
  • 如何在 ios 中打开文件浏览器并选择 .pdf 文件

    如何在 iPhone 中的应用程序中点击按钮时打开文件浏览器 它必须显示扩展名为 pdf 格式的文件 并且必须将其保存到本地数据库 例如 如果我们要发送一封电子邮件到 xyz 如果我们想发送文件 我们会附加一些文件 如果我们单击附加文件按钮
  • 使用ticker定期从经常变化的路径加载内存中的所有文件?

    我有一个应用程序需要从两个不同的路径读取文件 读取所有这些文件后 我需要将它们加载到内存中products map Path Full 这是内存中服务器启动期间需要加载的所有文件的路径 该路径将包含大约 50 个文件 每个文件大小约为 60
  • 覆盖保存文件的足够安全的方法?

    Using cstdio 覆盖文件最安全的方法是什么 在这种情况下 安全 意味着文件不会变得不完整或损坏 该文件将被完全覆盖 或者如果出现问题 它将是旧文件 我想最好的方法是创建一个临时中间文件 然后在中间完成后覆盖旧文件 如果这确实是最好
  • 在 Go 中传递任意函数作为参数

    我正在尝试扩展我对 Go 函数指针的了解 并且我有一个问题 在 Go 中将函数作为参数传递可以做什么 不可以做什么 假设我想写一个decorator 可以包装任何现有函数的函数 为简单起见 我们将其限制为仅接受一个参数并仅返回一个值的函数
  • 使用指针接收器调用函数的 Go 语法

    在Go中 如果我定义一个带有指针的函数作为接收者 它是否应该只允许从指针调用该函数 为什么从值本身调用这个函数就可以 并且有同样的效果 例如 在以下程序中 m1 reset 和 m2 reset 具有相同的效果 即使 m1 是一个值而 m2
  • Golang 处理数据库连接的“最佳实践”

    我有一个用 Go 编写的 Web 服务 目前我有一个全局包 我可以在任何地方导入它 其中包含与 MongoDB 的连接 通过 MGO 但我不得不说 这对我来说感觉非常恶心 在 Go 中维护与数据源的连接的最佳实践是什么 我来自 PHP 世界
  • go语言读取并合并两个Yaml文件

    假设我们有两个 yaml 文件 master yaml someProperty someVaue anotherProperty anotherValue 覆盖 yaml someProperty overriddenVaue 是否可以解
  • 创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有什么区别

    这可能很愚蠢 但我想知道后台操作的区别 InputStream is new FileInputStream filepath FileInputStream is new FileInputStream filepath 上面两行代码有什
  • 如何使用 C# 将标签/关键字添加到 Windows 文件属性详细信息选项卡

    理想情况下 我想使用 shell 类将标签添加到我的 Office 文档中 但我认为这样 tag 属性是只读项目 有人还有其他办法吗 关于这个主题的内容很少 感谢您的帮助 我进一步研究了 shellfile 类 答案就在我眼前 string

随机推荐

  • 如何从 Rails 中的 Warden/Devise after_authentication 回调访问会话

    我正在尝试从 Warden 访问当前会话验证后Rails 3 中的回调 在 Devise 下运行 在我的应用程序控制器的顶部我想做一些类似的事情 Warden Manager after authentication do user aut
  • 带有 ng-repeat 的 bootstrap-label 之间没有间距

    当我使用 angular js 中的 ng repeat 添加标签时 它们显示时没有间距 这里有一个Plunker这证明了这一点 但是如果我手动添加标签 只是复制了 html 那么它们就会显示为空白 有没有一种方法可以在标签之间添加空白而不
  • Ruby 相当于 Python 的 for / else

    我一直在寻找 Ruby 中类似 Python 的 while else 结构的东西来改进我的代码 这意味着执行循环 如果循环中的条件任何时候都不为真 则返回 else 语句中的值 在红宝石中 我可以这样做 if items empty Em
  • 获取Qt 4.8 SDK

    我已经有一段时间没有在 Windows 上使用 Qt 了 我知道现在我们应该从 Qt 项目网站下载开源版本 但页面位于http qt project org downloads具有指向 Qt 库和 Qt Creator 的安装程序的单独链接
  • Perl:将 Unicode 字符串打印到 Windows 控制台

    我在将 Unicode 字符串打印到 Windows 控制台 时遇到一个奇怪的问题 考虑这段文字 Intermediary Bye Hello world test 假设它位于名为 file txt 的文件中 当我 go type file
  • 带有字符串参数的主方法入口点给出“不包含...合适的...入口点”错误

    为什么下面的代码块会给出 不包含适合入口点的静态 Main 方法 的编译错误 namespace MyConApp class Program static void Main string args string tmpString tm
  • 动态添加到 DOM 的元素的单击事件

    在 jQuery 1 8 之前 我能够使用 live 在单击由 jquery 动态插入的按钮时触发 现在 on 和 bind 都不适用于页面加载后添加到 DOM 的元素 现在有哪些选择 parent element on click chi
  • 如何启动kubelet服务?

    我运行命令systemctl 停止 kubelet然后尝试启动它systemctl 启动 kubelet 但无法启动它 这是输出systemctl 状态 kubelet kubelet service kubelet The Kuberne
  • 不区分大小写的 str_replace

    我该如何使用str replace但在搜索字符串时不区分大小写 例如 假设我想替换ABcD with a 结果命令将是 string str replace ABcD a string 但是如果有一些像 abCD 这样的字符串 那么我必须再
  • 如何编辑外部 web.config 文件?

    我正在尝试编写一个 winform 应用程序 该应用程序能够编辑已安装的 Web 应用程序的 web config 文件 我已经通读了 ConfigurationManager 和 WebConfigurationManager 类方法 但
  • Python函数无法访问类变量

    我试图访问外部函数中的类变量 但是我收到 AttributeError 类没有属性 我的代码如下所示 class example def init self somevariable raw input Input something de
  • 从 MySQL 数据库读取 BLOB 图像

    我在从 MySQL 数据库读回 blob 时遇到一些问题 我已将其成功插入数据库 但似乎无法将其读回 我知道你们中的一些人可能会想 为什么他使用数据库来存储图像的 blob 而不仅仅是文件路径 文件名 但我希望具有灵活性 因为许多图像将存储
  • 从选择器 SwiftUI 中取消选择项目

    我使用带有选择器的表单 一切正常 我可以从选择器中选择一个元素 但我无法取消选择它 是否存在从选择器中取消选择项目的方法 谢谢你 Picker selection model countries label Text country For
  • 如何说服詹金斯共享多个作业的内部版本号?

    开发团队确实要求设置构建系统 因此每个构建都将为所有分支提供唯一的构建号 构建是由詹金斯使用每个分支的作业进行的 有一个 jenkins 插件可以为作业设置下一个版本号 但这有点无用 至少有两个原因 它将设置单个作业的内部版本号 您无法知道
  • 执行 SQL Server 脚本

    如何自动运行给定文件夹中的所有 SQL 脚本 编写 Windows 脚本 使用FOR构建循环遍历您的文件并使用SQLCMD执行每个文件的实用程序 for f in c MySQLScripts sql do sqlcmd i f
  • 在 Android 中从文件读取/写入字符串

    我想通过从 EditText 输入的文本将文件保存到内部存储 然后我希望同一个文件以字符串形式返回输入的文本并将其保存到另一个字符串以便稍后使用 这是代码 package com omm easybalancerecharge import
  • 在gradle中重命名apk

    我想从 gradle 重命名我的 apk 我在构建中有以下几行 applicationVariants all variant gt def file variant outputFile def filename file name re
  • shared_ptr会自动释放内存吗?

    我需要在这里使用shared ptr 因为我无法更改API Foo1 foo1 new Foo1 shared ptr
  • Linux,spidev:为什么它不应该直接在设备树中?

    我想定义一个具有用户模式访问权限的 SPI 设备 如中所述http linux sunxi org SPIdev 按照这些示例 我在设备树中添加了以下内容 ecspi1 other stuff mydev 0 compatible spid
  • 在Go中用小RAM读取大文件的最快方法[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想从不同的文本或JSON or CSV文件 我应该遵循哪种方法 我有博客文章文件读取 and 使用小 RAM 读取 2 GB 文本文件文件读取的不同方法 不同的方法 分块读取文