我必须反复读取数据文件并将数据存储到 (numpy) 数组中。我选择将数据存储到“数据字段”字典中:{'field1': array1,'field2': array2,...}。
使用列表(或collections.deque())“附加”新数据数组,代码高效。但是,当我连接存储在列表中的数组时,内存增长 并且我没有设法再次释放它。示例:
filename = 'test'
# data file with a matrix of shape (98, 56)
nFields = 56
# Initialize data dictionary and list of fields
dataDict = {}
# data directory: each entry contains a list
field_names = []
for i in xrange(nFields):
field_names.append(repr(i))
dataDict[repr(i)] = []
# Read a data file N times (it represents N files reading)
# file contains 56 fields of arbitrary length in the example
# Append each time the data fields to the lists (in the data dictionary)
N = 10000
for j in xrange(N):
xy = np.loadtxt(filename)
for i,field in enumerate(field_names):
dataDict[field].append(xy[:,i])
# concatenate list members (arrays) to a numpy array
for key,value in dataDict.iteritems():
dataDict[key] = np.concatenate(value,axis=0)
计算时间:63.4 s
内存使用情况(顶部):13862 gime_se 20 0 1042m 934m 4148 S 0 5.8 1:00.44 python
每次读取时直接连接 numpy 数组,效率低下但内存仍然受控 .示例:
nFields = 56
dataDict = {}
# data directory: each entry contains a list
field_names = []
for i in xrange(nFields):
field_names.append(repr(i))
dataDict[repr(i)] = np.array([])
# Read a data file N times (it represents N files reading)
# Concatenate data fields to numpy arrays (in the data dictionary)
N = 10000
for j in xrange(N):
xy = np.loadtxt(filename)
for i,field in enumerate(field_names):
dataDict[field] = np.concatenate((dataDict[field],xy[:,i]))
计算时间:1377.8 s
内存使用情况(顶部):14850 gime_se 20 0 650m 542m 4144 S 0 3.4 22:31.21 python
有没有什么方法既能达到情况 1 的性能,又能像情况 2 那样控制内存?
似乎在情况 1 中,连接列表成员 (np.concatenate(value,axis=0)) 时内存会增加。更好的想法?
最佳答案
根据我的观察,这是正在发生的事情。没有真正的内存泄漏。相反,Python 的内存管理代码(可能与您所在的任何操作系统的内存管理有关)决定在程序中保留原始字典(没有串联数组的字典)使用的空间。但是,它可以免费重复使用。我通过执行以下操作证明了这一点:
执行此操作时,我发现使用的内存量仅从 ~900 GB 增加到 ~1.3 GB。如果没有额外的字典内存,根据我的计算,Numpy 数据本身应该占用大约 427 MB,所以加起来。我们的函数创建的第二个初始的、未连接的字典只使用了已经分配的内存。
如果你真的不能使用超过 ~600 MB 的内存,那么我建议你使用 Numpy 数组,就像在内部使用 Python 列表所做的那样:分配一个包含一定数量列的数组,当你已经用完了,创建一个包含更多列的扩大数组并将数据复制过来。这将减少连接的数量,这意味着它会更快(尽管仍然不如列表快),同时减少内存使用。当然,实现起来也比较痛苦。
关于Python 列表/字典与 numpy 数组 : performance vs. 内存控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935892/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.