有几种方法可以附加到数组。想知道是否有已知的最佳性能方法来附加到未知长度的巨大数组 (100Mb)?我想避免复制,因为它会增加内存不足的机会,并且会降低性能。我应该考虑使用二维数组吗?
最佳答案
在 Golang 中我们有数组和 slice 。
你不应该保留对旧数组的引用,所以这 block 内存将被垃圾回收。
我添加了一个存储在多维数组中的示例,我强烈建议避免这种方法。它会使遍历更复杂和更慢,内存泄漏的可能性更高等等。 Golang 中的 GC 非常快。
BenchmarkStore/array-6 100000 20090 ns/op 0 B/op 0 allocs/op
BenchmarkStore/slice-6 5000 259940 ns/op 4654337 B/op 30 allocs/op
BenchmarkStore/Custom-6 10000 194152 ns/op 1747860 B/op 8 allocs/op
BenchmarkStore/Dimensions-6 3000 418654 ns/op 4458593 B/op 20 allocs/op
package main
import (
"testing"
)
const size = 100000
// Wrapper around slice
type MyStore struct {
growthFactor int
watermark int
Data []int
}
func NewMyStore(growthFactor, initialSize int) *MyStore {
return &MyStore{growthFactor: growthFactor, watermark: -1, Data: make([]int, initialSize)}
}
func (s *MyStore) Append(v int) {
nextPosition := s.watermark + 1
currentSize := len(s.Data)
full := currentSize == nextPosition
if full {
dataResize := make([]int, currentSize*s.growthFactor)
copy(dataResize, s.Data)
s.Data = dataResize
}
s.Data[nextPosition] = v
s.watermark = nextPosition
}
// Dimensions
const chunkSize = 10
type MyStoreMultiDimensions struct {
size int
watermark int
data [][chunkSize]int
}
func NewStoreMultiDimensions(chunks int) *MyStoreMultiDimensions {
return &MyStoreMultiDimensions{watermark: -1, data: make([][chunkSize]int, chunks)}
}
func (s *MyStoreMultiDimensions) Append(v int) {
nextPosition := s.watermark + 1
chunk := nextPosition / chunkSize
if len(s.data) <= chunk {
s.data = append(s.data, [chunkSize]int{})
}
s.data[chunk][nextPosition%chunkSize] = v
s.watermark = nextPosition
}
func BenchmarkStore(b *testing.B) {
b.Run("array", func(b2 *testing.B) {
for i := 0; i < b2.N; i++ {
var store [size]int
for item := 0; item < size; item++ {
store[item] = item
}
}
})
b.Run("slice", func(b2 *testing.B) {
for i := 0; i < b2.N; i++ {
var store []int
for item := 0; item < size; item++ {
store = append(store, item)
}
}
})
b.Run("Custom", func(b2 *testing.B) {
for i := 0; i < b2.N; i++ {
var store = NewMyStore(4, 10)
for item := 0; item < size; item++ {
store.Append(item)
}
}
})
b.Run("Dimensions", func(b2 *testing.B) {
for i := 0; i < b2.N; i++ {
var store = NewStoreMultiDimensions(2)
for item := 0; item < size; item++ {
store.Append(item)
}
}
})
}
关于go - 追加到长度未知的大数组的最佳执行方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54956610/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用