我有一个项目,我正在编写一个类,其中教授说我们不允许使用超过200米我用-Xmx50m限制堆栈内存到50米(只是为了绝对肯定)但是根据顶部,它仍然使用300米
我尝试运行Eclipse Memory Analyzer,它只报告26米
这可能都是堆栈上的内存吗?我很确定我从不会超过大约300个方法调用深度(是的,它是一个递归DFS搜索),所以这意味着每个堆栈帧几乎用完了看起来很难相信的兆字节.
该程序是单线程的.有谁知道我可能减少内存使用的任何其他地方?另外,如何检查/限制堆栈使用的内存量?
更新:我现在使用以下JVM选项没有效果(根据顶部仍然约300米): -Xss104k -Xms40m -Xmx40m -XX:MaxPermSize=1k
另一个更新:实际上,如果我让它运行一点点(带有所有这些选项)大约一半的时间它会在4或5秒后突然下降到150米(另一半它不会下降).这真的很奇怪的是我的程序没有随机(并且正如我所说的那样是单线程)所以没有理由它在不同的运行中表现不同
它可能与我正在使用的JVM有关吗?
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~10.04)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
根据java -h,默认的JVM是-server.我尝试添加-cacao和现在(所有其他选项)它只有59米.所以我想这解决了我的问题.谁能解释为什么这是必要的?另外,我应该知道有什么缺点吗?
还有一个更新:与服务器相比,可可真的很慢.这是一个糟糕的选择
我正在阅读关于Coq的教程.它构造一个bool类型如下:
Coq < Inductive bool : Set := true | false.
bool is defined
bool_rect is defined
bool_ind is defined
bool_rec is defined
Run Code Online (Sandbox Code Playgroud)
然后它显示了这些东西正在使用"检查".
Coq < Check bool_ind.
bool_ind
: forall P : bool -> Prop, P true -> P false -> forall b : bool, P b
Coq < Check bool_rec.
bool_rec
: forall P : bool -> Set, P true -> P false -> forall b : bool, P b
Coq < Check bool_rect.
bool_rect
: …Run Code Online (Sandbox Code Playgroud) "并行和并发编程"中的这个图表:http://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity起初似乎表明存在严重的开销,引发太多.但是如果仔细观察y轴,你会发现它已被放大到有趣的部分.事实上,最佳和最差案例表现之间的比例约为80%,这也不算太糟糕.
一般来说,确定块的方式和数量是困难的,容易出错,极其特定于应用程序,并且明年当您购买具有更强处理能力的新计算机时可能会发生变化.我更倾向于总是使用rpar来获得最细粒度的物品并以25%的开销生活.
引发的开销通常会产生比此图所示更糟糕的成本吗?(特别是如果我总是折叠二叉树而不是列表,那么关于"顺序工作量"的第二个要点不适用)
针对Don Stewart的回答更新了问题:
火花池是否只包含一个所有处理器都难以访问的队列?还是有很多?
例如,如果我有一台具有无限处理器和二叉树的计算机,我想在所有叶子上取总和,如:
data Node = Leaf Int | Branch Node Node
sumL (Leaf x) = x
sumL (Branch n1 n2) = let (x,y) = (sumL n1, sumL n2) in (x `par` y) `seq` (x + y)
Run Code Online (Sandbox Code Playgroud)
这个程序会在O(#leaves)时间运行吗?或O(深度)时间?有没有更好的方法来写这个?
如果我抽出太多东西以获得满意的答案,请告诉我.我对haskell并行性如何工作的心理模型仍然非常模糊.
parallel-processing multithreading haskell overhead moores-law
我正在Amazon Elastic MapReduce上运行大型(超过100个节点)系列的mapreduce作业.
在reduce阶段,已经完成的map任务会随之失败
Map output lost, rescheduling: getMapOutput(attempt_201204182047_0053_m_001053_0,299) failed :
java.io.IOException: Error Reading IndexFile
at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:113)
at org.apache.hadoop.mapred.IndexCache.getIndexInformation(IndexCache.java:66)
at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:3810)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)
at org.apache.hadoop.http.HttpServer$QuotingInputFilter.doFilter(HttpServer.java:835)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at java.io.DataInputStream.readLong(DataInputStream.java:399)
at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:74)
at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:54)
at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:109)
... 23 more
Run Code Online (Sandbox Code Playgroud)
映射器针对这种情况的比例很少,足,我不会介意,只是当它,减速机全部暂停,等待1地图任务重新运行所以整个工作一直暂停,每次1-5分钟. …
hadoop jetty amazon-web-services amazon-emr elastic-map-reduce
如何从std::set迭代中删除元素
我的第一次尝试看起来像:
set<T> s;
for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
//Do some stuff
if(/*some condition*/)
s.erase(iter--);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我们想要从集合中删除第一个元素,那么这是有问题的,因为iter--迭代器无效.
这样做的标准方法是什么?
haskell是否具有并行"和"方法
parAnd :: Bool -> Bool -> Bool
Run Code Online (Sandbox Code Playgroud)
这样的
(a `parAnd` b)
Run Code Online (Sandbox Code Playgroud)
一旦a或b评估为假(并且不等待另一个),将并行激发a和b的并行评估并返回false?
有没有办法实现这样的事情?
我使用-1作为返回类型为size_t(无符号类型)的函数的标志值.
我一开始并没有注意到它,特别是因为它没有导致我的代码中的任何错误(我用x == -1,而不是x <0来检查它).
是否有任何微妙的原因我不应该留下它?什么时候这可能出乎意料?这是常用的吗?
ptrdiff_t不太常见,输入时间较长,而且无论如何它都不是合适的类型,因为函数会将索引返回到数组中.
关于seq如何在Haskell中运行,我并不完全清楚.
似乎有很多情况下写它会很有用
seq x x
Run Code Online (Sandbox Code Playgroud)
甚至可能定义一个函数:
strict x = seq x x
Run Code Online (Sandbox Code Playgroud)
但是这样的功能还不存在,所以我猜这种方法在某种程度上是错误的.有人能告诉我这是否有意义或有用吗?
我想写一些类似的东西:
f :: (a -> b) -> a -> c -> b
f g =
let inner :: a -> c -> b
inner x y = g x
in inner
Run Code Online (Sandbox Code Playgroud)
但是这给了我一个错误.因为它没有意识到我正在尝试引用与声明中相同的"a"和"b"类型作为f
我怎样才能明确地给出内在的正确类型?
对于STL集合,您似乎应该能够说:
if(s.find(x)) {
//Something
}
Run Code Online (Sandbox Code Playgroud)
而不是
if(s.find(x) != s.end()) {
//Something
}
Run Code Online (Sandbox Code Playgroud)
此外,如果set-iterators可以转换为bool(如果内部指针不为null,则为true),您将能够.为什么STL set迭代器没有这个简单的功能?故意遗漏了吗?
澄清:
或者,set可以只有一个set :: contains(x)方法直接返回一个bool,但这似乎也没有实现.我知道它只有几个字符,但是在s是某个函数的返回值的情况下,这可能会令人沮丧,因为需要创建一个临时变量,即(假设m是类型map<int,set<int>>)
const set<int>& s = m[i];
return s.find(x) != s.end();
Run Code Online (Sandbox Code Playgroud)
而不是
return m[i].contains(x);
Run Code Online (Sandbox Code Playgroud)
要么
return m[i].find(x);
Run Code Online (Sandbox Code Playgroud)
编辑:
我没有意识到count()方法可以用作contains().投票结束,因为这个问题没有正确地说出我真正应该问的问题:STL :: set是否有"包含"方法?
haskell ×4
c++ ×3
set ×3
stl ×2
amazon-emr ×1
boolean ×1
c ×1
casting ×1
coding-style ×1
coq ×1
d ×1
hadoop ×1
java ×1
jetty ×1
memory ×1
moores-law ×1
overhead ×1
stack ×1
typechecking ×1
types ×1