返回顶部
首页 > 资讯 > 后端开发 > GO >有效使用互斥体进行映射的读写操作
  • 422
分享到

有效使用互斥体进行映射的读写操作

2024-04-04 23:04:46 422人浏览 八月长安
摘要

学习golang要努力,但是不要急!今天的这篇文章《有效使用互斥体进行映射的读写操作》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

学习golang要努力,但是不要急!今天的这篇文章《有效使用互斥体进行映射的读写操作》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在读取一个包含 1kk+ 个对象的 JSON 文件,我需要组织并计算一些数据,为此我创建了两个地图,以便我可以对其进行写入和读取,当我运行一个简单的循环时,代码需要 40 秒才能完成,例如:

var acc int
firstcontent := make(map[string]int)
secondcontent := make(map[string]int)

decoder := json.newdecoder(bufio.newreader(file))

for decoder.more() {
    var dt &mystruct{}
    decoder.decode()

    if _, ok := firstcontent[dt.name]; !ok {
        firstcontent["some-data"] = 1
        acc++ // count the uniqueness
    } else {
        firstcontent["some-data"] += 1
    }

    if _, ok := secondcontent[dt.city]; !ok {
        first["some-data"] = 1
    } else {
        first["some-data"] += 1
    }
}

我尝试使用 goroutinesmutex 进行优化以避免并发,但是当我使用它时,需要更长的时间才能完成。

var mutex = sync.RWMutex{}

for reader.More() {
    var dt &MyStruct{}
    reader.Decode(&dt)

    go func(name string) {
        mutex.Lock()
        if _, ok := firstContent[name]; !ok {
            firstContent[name] = 1 // need to convert to *int64, i know...
            atomic.AddInt32(acc, 1)
        } else {
            atomic.AddInt64(firstContent[name], 1)
        }
        mutex.Unlock()
    }(dt.Name)

    go func(city string) {
        mutex.Lock()
        if _, ok := secondContent[city]; !ok {
            secondContent[city] = 1
        } else {
            atomic.AddInt(secondContent[city], 1)
        }
        mutex.Unlock()
    }(dt.City)
}

为什么需要更长的时间才能完成?因为mutex.lock()?在这种情况下如何提高速度?


正确答案


您的问题无法通过并发解决。花费大部分时间的是解析 json,而不是计算名称。你可以说这种情况有点矛盾,因为你必须在单线程上读取文件。也许将文件拆分成更小的文件并在单独的线程上处理每个文件会有所帮助,如果您当然可以这样做的话。

以上就是《有效使用互斥体进行映射的读写操作》的详细内容,更多关于的资料请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 有效使用互斥体进行映射的读写操作

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

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

猜你喜欢
  • 有效使用互斥体进行映射的读写操作
    学习Golang要努力,但是不要急!今天的这篇文章《有效使用互斥体进行映射的读写操作》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!...
    99+
    2024-04-04
  • 使用Python对Excel进行读写操作
    学习Python的过程中,我们会遇到Excel的读写问题。这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据。下面我们介绍如何实现使用Python对Excel进...
    99+
    2022-06-04
    操作 Python Excel
  • PHP开发中如何使用Memcache进行高效的数据读写操作?
    在 PHP 开发中,使用 Memcache 缓存系统可以大大提高数据读写的效率。Memcache 是一种基于内存的缓存系统,它可以将数据缓存在内存中,避免频繁的读写数据库。本文将介绍如何在 PHP 中使用 Memcache 进行高效的数据读...
    99+
    2023-11-07
    PHP Memcache 数据读写
  • C++ qt如何使用jsoncpp json进行读写操作
    这篇文章将为大家详细讲解有关C++ qt如何使用jsoncpp json进行读写操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JsonCpp的使用项目需要c++下使用...
    99+
    2023-06-21
  • Linux下如何使用Octave对文件进行读写操作
    小编给大家分享一下Linux下如何使用Octave对文件进行读写操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Octave 是一个 Linux 上类似于 Ma...
    99+
    2023-06-27
  • 如何在Python中使用Numpy进行文件读写操作?
    当我们在使用Python进行科学计算时,Numpy是一个非常重要的工具。它提供了大量的数学函数和数组操作方法,可以让我们更高效地进行数据分析和处理。在本文中,我们将介绍如何使用Numpy进行文件读写操作,并提供一些示例代码。 文件读写操作...
    99+
    2023-06-01
    numpy django 文件
  • 如何在Laravel中使用对象关系映射(ORM)进行数据库操作?
    Laravel是一款流行的PHP框架,它提供了许多方便的工具和库来简化Web应用程序的开发过程。其中一个重要的工具就是对象关系映射(ORM),它可以帮助开发人员在Laravel中进行数据库操作。 ORM是一种将关系型数据库中的表映射到面向对...
    99+
    2023-09-25
    编程算法 laravel 对象
  • linux中如何使用Octave对音频文件进行读写操作
    这篇文章主要介绍了linux中如何使用Octave对音频文件进行读写操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Octave 是一个 Linux 上类似于 Matlab...
    99+
    2023-06-16
  • 有效使用Python和Linux平台进行脚本操作
    有效使用Python和Linux平台进行脚本操作在现代技术和信息时代,Python和Linux成为了非常强大的工具和平台,用于开发和运行各种脚本操作。Python是一种高级编程语言,拥有简洁而又强大的语法,可以轻松地进行数据处理、网络编程、...
    99+
    2023-10-22
    Python脚本 脚本操作 Linux平台
  • C#中如何使用文件IO和流操作进行数据读写
    C#中如何使用文件IO和流操作进行数据读写,需要具体代码示例在C#编程中,文件IO和流操作是常用的技术,用于读取和写入文件的数据。无论是处理文本文件、二进制文件,还是读取网络流数据,我们都可以通过文件IO和流操作来实现。文件IO和流操作提供...
    99+
    2023-10-22
    C#文件IO操作 C#流操作 数据读写技术
  • C#中如何使用文件IO和流操作进行数据读写及解决方法
    C#中如何使用文件IO和流操作进行数据读写及解决方法在开发过程中,我们常常需要进行文件的读写操作。C#提供了丰富的文件IO和流操作,使得数据的读写变得更加灵活和高效。本文将探讨C#中如何使用文件IO和流操作进行数据读写,并提供具体的代码示例...
    99+
    2023-10-22
    文件IO:C#中的文件IO操作
  • 如何使用索引在Python中进行高效的数据操作?
    Python是一种高级编程语言,它提供了许多内置的数据结构和算法,使得数据操作变得更加容易和高效。在Python中,索引是一种非常重要的数据结构,可以帮助我们快速地访问和操作数据。在本文中,我们将介绍如何使用索引在Python中进行高效的数...
    99+
    2023-07-23
    linux numy 索引
  • PyMongo进行MongoDB查询和插入操作的高效使用示例
    目录插入到集合中插入多个文档查找一个查找所有不允许在同一对象中同时指定0和1值高级查询使用正则表达式过滤插入到集合中 要将记录(在MongoDB中称为文档)插入到集合中,使用insert_one()方法。insert_o...
    99+
    2023-11-16
    PyMongo 进行 MongoDB 查询和插入操作 PyMongo MongoDB
  • PHP开发中如何使用Memcache进行高效的数据读写和查询?
    PHP开发中如何使用Memcache进行高效的数据读写和查询?Memcache是一个高性能的分布式内存对象缓存系统,它可以有效地处理数据的读写和查询操作,提高Web应用程序的性能和响应速度。在PHP开发中,使用Memcache可以极大地提升...
    99+
    2023-11-07
    Memcache 高效 数据读写
  • java使用Buffer进行I/O流操作的方法有哪些
    小编给大家分享一下java使用Buffer进行I/O流操作的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用Buffer进行I/O流操作除NIO外,使...
    99+
    2023-06-27
  • 如何在 Python 函数中使用 Linux 数组进行高效的数据操作?
    Python 是一种广泛使用的高级编程语言,其语法简单易懂,功能强大。在 Python 中,函数是一种非常重要的编程结构,它可以让代码更加模块化,方便维护和复用。而 Linux 数组则是一种强大的数据结构,可以帮助我们高效地进行数据操作。本...
    99+
    2023-07-20
    函数 linux 数组
  • 自然语言处理中,如何使用 Python 和 NumPy 进行高效的索引操作?
    自然语言处理(NLP)是人工智能领域中非常重要的一部分。在处理大量文本数据时,高效的索引操作是至关重要的。Python和NumPy是NLP领域中非常流行的编程语言和库,它们能够帮助我们进行高效的索引操作。 本文将介绍如何使用Python和N...
    99+
    2023-10-27
    自然语言处理 numy 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作