返回顶部
首页 > 资讯 > 精选 >用 go 重写文件最快的方法是什么
  • 169
分享到

用 go 重写文件最快的方法是什么

2024-02-06 09:02:15 169人浏览 泡泡鱼
摘要

问题内容 我有一个大文件(无法完全放入内存),其中包含各种大小的字符串。我想将这些字符串重写到另一个文件中,但每个字符串都大写。在 Go 中实现这一目标的最快方法是什么? 这是我能想到

问题内容

我有一个大文件(无法完全放入内存),其中包含各种大小的字符串。我想将这些字符串重写到另一个文件中,但每个字符串都大写。在 Go 中实现这一目标的最快方法是什么?

这是我能想到的最有效的方法。关于如何使其更快的任何想法?

package main

import (
    "bufio"
    "log"
    "os"
    "strings"
)

func main() {
    inputFile, err := os.Open("input.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer inputFile.Close()

    outputFile, err := os.Create("output.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer outputFile.Close()

    scanner := bufio.NewScanner(inputFile)
    writer := bufio.NewWriter(outputFile)

    for scanner.Scan() {
        line := scanner.Text()
        capitalized := strings.ToUpper(line)
        _, err := writer.WriteString(capitalized + "\\n")
        if err != nil {
            log.Fatal(err)
        }
    }

    err = writer.Flush()
    if err != nil {
        log.Fatal(err)
    }
}


正确答案


一个起点是运行 go 测试包 基准测试。

对于基准数据,我使用 275,502 个单词(大部分为小写)、3,077,701 字节的 linux 字典文件:/usr/share/dict/brazilian。鉴于您对文件的模糊描述,这是我能做的最好的事情。为了避免基准磁盘 i/o,我对 io.reader 使用 bytes.reader,对 io.writer 使用 ioutil.discard。

代码的结果:

$ go test upper_so_test.go -run=! -benchmem -bench=.
benchmarkso-12   48  22765120 ns/op  8143216 b/op  550993 allocs/op

blunderific 代码的结果:

benchmarkb-12    94  13061407 ns/op  3782866 b/op  275505 allocs/op

作为概念验证 (poc),我使用字典文件编写了使用最少 cpu 和内存的代码。到目前为止,我的 poc 代码的结果:

benchmarktu-12  182   6457334 ns/op     8240 b/op       3 allocs/op

将我的 poc 代码作为程序运行,使用 ssd 文件存储来读取和写入字典文件,需要几毫秒的时间:

$ time ./upper
real    0m0.031s
user    0m0.014s
sys     0m0.009s

即使没有文件的一小部分样本,也无法提出性能改进的具体建议。然而,使用字典文件,我的 poc 基准测试结果与您的基准测试结果(6,457,334 ns/op vs. 22,765,120、8,240 b/op vs. 8,143,216、3 allocs/op vs. 550,993)确实表明您对 cpu 的过度使用内存会损害性能。

upper_so_test.go:

package main

import (
    "bufio"
    "bytes"
    "io"
    "io/ioutil"
    "os"
    "strings"
    "testing"
)

func SOToUpper(r io.Reader, w io.Writer) error {
    scanner := bufio.NewScanner(r)
    writer := bufio.NewWriter(w)
    for scanner.Scan() {
        line := scanner.Text()
        capitalized := strings.ToUpper(line)
        _, err := writer.WriteString(capitalized + "\n")
        if err != nil {
            return err
        }
    }
    err := writer.Flush()
    if err != nil {
        return err
    }
    return nil
}

var benchData = func () []byte {
    data, err := os.ReadFile(`/usr/share/dict/brazilian`)
    if err != nil {
        panic(err)
    }
    return data
}()

func BenchmarkSO(b *testing.B) {
    for i := 0; i < b.N; i++ {
        r := bytes.NewReader(benchData)
        w := ioutil.Discard
        err := SOToUpper(r, w)
        if err != nil {
            b.Error(err)
        }
    }
}

以上就是用 go 重写文件最快的方法是什么的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 用 go 重写文件最快的方法是什么

本文链接: https://lsjlt.com/news/561363.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用 go 重写文件最快的方法是什么
    问题内容 我有一个大文件(无法完全放入内存),其中包含各种大小的字符串。我想将这些字符串重写到另一个文件中,但每个字符串都大写。在 go 中实现这一目标的最快方法是什么? 这是我能想到...
    99+
    2024-02-06
  • 远程传输文件到vps最快方法是什么
    远程传输文件到VPS的最快方法取决于多个因素,包括网络速度、文件大小和所用的传输协议。以下是一些常见的方法:1. SCP(Secur...
    99+
    2023-09-15
    vps
  • Java重写AST插件的方法是什么
    本篇内容主要讲解“Java重写AST插件的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java重写AST插件的方法是什么”吧!1. 介绍随着Java 6的发布,java编译器已经有了...
    99+
    2023-06-17
  • Bash 中 go 重定向的最佳方法是什么?
    Bash 是一个广泛使用的 Unix shell,它提供了许多强大的特性,包括 I/O 重定向。在 Bash 中,I/O 重定向是一种将输入或输出流从一个文件或命令重定向到另一个文件或命令的方法。在本文中,我们将探讨 Bash 中 go ...
    99+
    2023-10-15
    重定向 bash 存储
  • python文件读写的方法是什么
    今天小编给大家分享一下python文件读写的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:在Python中,...
    99+
    2023-06-29
  • makefile文件编写的方法是什么
    编写Makefile文件有以下几个步骤:1. 确定目标文件:Makefile文件中首先需要确定要生成的目标文件(可执行文件、库文件等...
    99+
    2023-09-12
    makefile
  • 实时监控Go文件对象的最佳方法是什么?
    在Go语言中,文件操作是非常常见的操作,特别是在涉及到大量数据处理的场景下,我们需要实时地监控文件对象的变化,以便及时处理数据。那么,实时监控Go文件对象的最佳方法是什么呢?本文将为你介绍几种常见的方法,并提供演示代码。 方法一:使用os...
    99+
    2023-10-07
    文件 对象 实时
  • C#读写xml文件的方法是什么
    这篇“C#读写xml文件的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#读写xml文件的方法是什么”文章吧。C...
    99+
    2023-07-05
  • 了解Python中HTTP文件重定向的最佳方法是什么?
    Python是一种功能强大的编程语言,它可以用于各种不同的任务,包括网络编程。在网络编程中,HTTP文件重定向是一个常见的问题,特别是当你需要访问一个被重定向的URL时。在本文中,我们将深入探讨Python中HTTP文件重定向的最佳方法。 ...
    99+
    2023-08-27
    http 文件 重定向
  • json转map最快的方法是什么
    将JSON转换为Map的最快方法是使用Jackson库。Jackson是一个非常快速和高效的JSON处理库,它提供了将JSON字符串...
    99+
    2023-09-12
    json map
  • centos重命名文件的方法是什么
    在CentOS中,可以使用`mv`命令来重命名文件。命令的基本语法如下:```mv [选项] 原文件名 新文件名```例如,要将文件...
    99+
    2023-09-15
    centos
  • python重命名文件的方法是什么
    这篇文章主要介绍“python重命名文件的方法是什么”,在日常操作中,相信很多人在python重命名文件的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python重命名文件的方法是什么”的疑惑有所...
    99+
    2023-07-05
  • node.js文件系统之文件写入的方法是什么
    本文小编为大家详细介绍“node.js文件系统之文件写入的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“node.js文件系统之文件写入的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、语...
    99+
    2023-07-05
  • c#中ini文件读写的方法是什么
    在C#中,可以使用System.IO命名空间下的StreamReader和StreamWriter类来读写INI文件。以下是一个简单...
    99+
    2024-03-11
    c#
  • vue下载文件及文件重命名的方法是什么
    这篇文章主要介绍“vue下载文件及文件重命名的方法是什么”,在日常操作中,相信很多人在vue下载文件及文件重命名的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue下载文件及文件重命名的方法是什么...
    99+
    2023-07-04
  • Java和JVM的重载和重写方法是什么
    本文小编为大家详细介绍“Java和JVM的重载和重写方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java和JVM的重载和重写方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.案例void&...
    99+
    2023-06-28
  • linux多进程读写文件的方法是什么
    Linux中多进程读写文件的方法有以下几种:1. 使用文件锁(File Locking):可以使用文件锁来确保在任意时刻只有一个进程...
    99+
    2023-09-27
    linux
  • qt多线程读写文件的方法是什么
    在Qt中,可以使用QThread类来实现多线程读写文件。首先,创建一个自定义的QThread子类,重写其run()函数,该函数会在子...
    99+
    2023-09-22
    qt
  • Linux Bash写入文件的具体方法是什么
    这篇文章给大家介绍Linux Bash写入文件的具体方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用重定向操作符写入文件在Bash中,输出的重定向使您可以从命令捕获输出并将其写入文件。将输出重定向和写入文件...
    99+
    2023-06-28
  • java文件读取和写入的方法是什么
    Java中读取和写入文件的方法有很多,以下是其中几种常用的方法: 使用File类:可以使用File类来创建、删除、重命名文件,以及...
    99+
    2023-10-23
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作