我在使用 Perl 多年后才开始使用 Go,从最初的测试来看,从硬盘驱动器读取文本文件到散列中的速度似乎不如 Perl。
在 Perl 中,我使用“File::Slurp”模块,它有助于非常快地将文件读入内存(读入字符串变量、数组或散列)——在硬盘读取吞吐量的限制下。
我不确定使用 Go 阅读的最佳方式是什么,例如500MB CSV 文件,其中 10 列存入内存(进入哈希),其中哈希的键是第一列,值是其余 9 列。
实现此目标的最快方法是什么?目标是读取并存储到一些 Go 内存变量中,速度与硬盘驱动器传输数据的速度一样快。
这是输入文件中的一行 - 大约有 2000 万行:
1341,2014-11-01 00:01:23.588,12000,AV7WN259SEH1,1133922,SingleOven/HCP/-PRODUCTION/-23C_30S,0xd8d2a106d44bea07,8665456.006,5456-02,3010-39AVNHO2,5456-02,3010-30SE
平台是 Win 7 - i7 英特尔处理器和 16GB 内存。如果这样做有好处,我也可以在 Linux 上安装 Go。
编辑:
所以一个用例是——将整个文件加载到内存中,尽可能快地加载到 1 个变量中。稍后我可以扫描该变量,拆分(全部在内存中)等。
另一种方法是在加载期间将每一行存储为键值对(例如,在 X 字节通过后或\N 字符到达后)。
对我来说——这两种方法可以产生不同的性能结果。但由于我是 Golang 的新手 - 我可能需要几天的时间才能在 Golang 中尝试不同的技术来制作最佳性能算法。
我想学习在 Golang 中执行上述操作的所有可能方法以及推荐的方法。此时我不关心内存使用情况,因为这个过程将在第一个文件处理完成后立即重复 10,000 次(每个文件将在处理完成后立即从内存中删除)。文件范围从 50MB 到 500MB。由于有数千个文件 - 任何性能提升(甚至每个文件 1 秒的提升)都是显着的整体提升。
我不想让以后如何处理数据的问题变得复杂,只是想了解从驱动器读取文件并存储在哈希中的最快方法。我将对我的发现进行更详细的基准测试,并且随着我更多地了解在 Golang 中执行此操作的不同方法以及听到更多建议。我希望有人已经对这个主题进行了研究。
最佳答案
ioutil.ReadFile将整个文件读入内存可能是一个很好的开始。话虽如此,这听起来像是对内存资源的不当使用。问题断言 File::Slurp 很快,but this is not general consensus针对您正在执行的特定任务,即逐行处理。
声称 Perl 以某种方式“快速”地做事。我们可以看看source code到 Perl 的 File::Slurp。据我所知,它没有施展任何魔法。正如 Slade 在评论中提到的,它只是使用 sysopen和 sysread ,这两者最终都会触底到普通的操作系统调用。坦率地说,一旦您接触磁盘 I/O,您就迷失了方向:您唯一的希望就是尽可能少地接触它。
鉴于您的文件是 500MB,无论如何您都必须读取磁盘文件的所有字节,并且您必须面向行的传递来处理每一行,我不太明白为什么需要分两次执行此操作。为什么要将其从根本上的一次通过算法转变为二次通过算法?
如果您不显示任何其他代码,我们无法真正判断您所做的是快还是慢。没有测量,我们就不能说出任何实质性的东西。您是否尝试使用 bufio.Scanner() 编写直接代码?首先,然后 measure performance ?
关于perl - 使用 Go 将文本文件从硬盘读取到内存的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811546/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。