Tag: 内存

C ++ 11primefaces内存sorting – 这是放松(释放 – 消耗)sorting的正确用法吗?

我最近使用三重缓冲区的std :: atomic将C ++ 11作为端口,用作并发同步机制。 这个线程同步方法背后的想法是,对于生产者 – 消费者的情况,你有一个运行速度更快的生产者,消费者,三重缓冲可以给一些好处,因为生产者线程不会因为等待而“放慢”为消费者。 在我的情况下,我有一个更新为〜120fps的物理线程和一个以〜60fps运行的渲染线程。 很明显,我希望渲染线程总是获得最近的状态,但是我也知道,由于速率的不同,我将跳过物理线程中的很多帧。 另一方面,我希望我的物理线程保持其不变的更新速度,而不会被较慢的呈现线程locking我的数据所限制。 原来的C代码是由remis-thoughts制作的,完整的解释在他的博客里 。 我鼓励任何有兴趣阅读的人进一步了解原始实施。 我的实现可以在这里find。 基本思想是在任何给定的时间,有一个有3个位置(缓冲区)和一个primefaces标志的数组,它们被比较和交换来定义哪个数组元素对应于什么状态。 这样,只有一个primefacesvariables用于模型数组的所有3个索引和三重缓冲背后的逻辑。 缓冲区的3个位置被命名为Dirty,Clean和Snap。 生产者总是写入脏指数,并且可以翻转书写器以将脏指数与当前的干净指数交换。 使用者可以请求一个新的Snap,它使用Clean索引交换当前的Snap索引以获得最新的缓冲区。 消费者总是在Snap位置读取缓冲区。 该标志由一个8位无符号整数组成,这些位对应于: (未使用)(新写入)(2个脏)(2个清理)(2个捕捉) 新的写额外位标志由写入器设置并由读取器清除。 读者可以使用它来检查自上次捕捉以来是否有任何写入,如果没有,则不会再捕捉。 标志和索引可以使用简单的按位操作来获得。 好的,现在的代码: template <typename T> class TripleBuffer { public: TripleBuffer<T>(); TripleBuffer<T>(const T& init); // non-copyable behavior TripleBuffer<T>(const TripleBuffer<T>&) = delete; TripleBuffer<T>& operator=(const TripleBuffer<T>&) = delete; T snap() const; // get […]

multithreading是否强调内存碎片?

描述 当使用openmp的parallel构造来分配和释放具有4个或更multithreading的随机大小的内存块时,程序似乎开始在testing程序的运行时间的后半部分泄漏大量的内存。 因此,它将消耗的内存从1050 MB增加到1500 MB或更多,而实际上并没有使用额外的内存。 由于valgrind没有显示任何问题,我必须假设内存泄漏实际上是内存碎片的强调效果。 有趣的是,如果2个线程每个分配10000个分配,效果不会显示,但是如果4个线程分别分配5000个分配,则效果会很强。 另外,如果分配的块的最大大小减less到256kb(从1mb),效果变弱。 重型并发可以强调分割吗? 或者这更可能是一个堆中的错误? testing程序说明 演示程序的构build是为了从堆中获取总共256 MB的随机大小的内存块,并进行5000次分配。 如果内存限制被触发,首先分配的块将被释放,直到内存消耗降到限制以下。 一旦执行了5000个分配,所有的内存都被释放,循环结束。 所有这些工作都是由openmp生成的每个线程完成的。 这种内存分配scheme允许我们预计每个线程(包括一些簿记数据)的内存消耗约为260 MB。 演示程序 由于这真的是你可能想要testing的东西,所以你可以用一个简单的makefile从下拉框下载示例程序。 按原样运行程序时,应该至less有1400 MB的RAM可用。 随意调整代码中的常量以满足您的需求。 为了完整,实际的代码如下: #include <stdlib.h> #include <stdio.h> #include <iostream> #include <vector> #include <deque> #include <omp.h> #include <math.h> typedef unsigned long long uint64_t; void runParallelAllocTest() { // constants const int NUM_ALLOCATIONS = 5000; // alloc's […]

为什么memcpy()的速度每4KB急剧下降?

我testing了memcpy()的速度,注意到速度在i * 4KB下急剧下降。 结果如下:Y轴是速度(MB /秒),X轴是memcpy()的缓冲区大小,从1KB增加到2MB。 图2和图3详细描述了1KB-150KB和1KB-32KB的部分。 环境: CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz OS:2.6.35-22-generic#33-Ubuntu GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99 我想它必须与高速caching相关,但是我无法从以下高速caching不友好的情况中find原因: 为什么我的程序在循环8192个元素时变慢? 为什么转置512×512的matrix要比转置513×513的matrix慢得多? 由于这两种情况的性能下降是由不友好的循环引起的,这些循环将零散的字节读入高速caching,浪费了高速caching行的剩余空间。 这是我的代码: void memcpy_speed(unsigned long buf_size, unsigned long iters){ struct timeval start, end; unsigned char * pbuff_1; unsigned char * pbuff_2; pbuff_1 = malloc(buf_size); pbuff_2 = malloc(buf_size); gettimeofday(&start, NULL); for(int i = 0; […]

在C ++中的vector存储

我希望存储一个d维点的大向量(d fixed和small:<10)。 如果我将一个Point定义为vector<int> ,我认为一个vector<Point>将在每个位置存储一个指向Point的指针。 但是,如果将Point定义为像std::tuple<int,int,…,int>或std::array<int, d>这样的固定大小的对象,程序会将所有点存储在连续的内存中还是将间接的额外水平仍然存在? 如果答案是数组避免了额外的间接寻址,那么在扫描vector<Point>会不会影响性能(caching利用本地化)?

如何在.NET中以编程方式测量当前进程的总内存消耗?

如何在.NET中以编程方式测量当前进程的总内存消耗?

class class [B在Java中代表什么?

我正在尝试一个工具在这里testing我的Java内存使用情况。 它读入一个堆转储文件并将信息打印为html。 但是,这些表格显示如下: Class Instance Count Total Size class [B 36585 49323821 class [Lcom.sun.mail.imap.IMAPMessage; 790 16254336 class [C 124512 12832896 class [I 23080 11923504 class [Ljava.lang.Object; 13614 6664528 class java.lang.String 108982 2179640 class java.lang.Integer 219502 878008 这些是什么[B [C等级?

我应该如何以高效的内存方式将string键映射到Java中的值?

我正在寻找一种方法来存储一个string – >诠释映射。 当然,HashMap是一个最明显的解决scheme,但由于内存受限,需要存储200万对,7个字符长的键,我需要一些内存有效的,检索速度是次要参数。 目前我正沿着以下路线走: List<Tuple<String, int>> list = new ArrayList<Tuple<String, int>>(); list.add(…); // load from file Collections.sort(list); 然后进行检索: Collections.binarySearch(list, key); // log(n), acceptable 我是否应该去一个自定义树(每个节点单个字符,每个叶子的结果),还是有一个现有的集合,适合这个很好? string实际上是连续的(英国邮政编码,它们差别不大),所以我期望在这里节省内存。

如何在.net中处理一个类?

.NET垃圾收集器最终将释放内存,但是如果您立即想要回收内存呢? 您需要在类MyClass中调用哪些代码 MyClass.Dispose() 并通过MyClassvariables和对象释放所有使用的空间?

Matplotlib和Pyplot.close()不释放内存? – 后端相关的Qt4Agg

编辑:如果我明白更改后台matplotlib从'Qt4Agg'只是'聚',那么我能够运行我的代码没有错误。 我认为这是后端的错误? 我正在编写一些自动处理大量数据的代码。 代码首先parsing我的数据文件并存储所有相关的位。 然后我有不同的function来生成我需要的每个图表(大约有25个)。 但是,我不断遇到某种内存错误,我认为这是因为Matplotlib / PyPlot没有正确释放内存。 每个绘图函数都以pyplot.close(fig)命令结束,因为我只是想保存graphics而不是立即查看它们,所以不包含pyplot.show()。 如果我在解释器中分别运行绘图函数,那么我不会遇到任何问题。 但是,如果我做一个单独的函数,依次调用每个绘图函数,那么我会遇到“MemoryError:无法为path分配内存”。 有没有人遇到这样的问题? 这似乎与Matplotlib在循环绘制时耗尽内存有关,但pyplot.close()不能解决我的问题。 这是我的代码中典型的绘图function的样子: def TypicalPlot(self, title=None, comment=False, save=False, show=True): if title is None: title = self.dat.title fig = plt.figure() host = SubplotHost(fig, 111) fig.add_subplot(host) par = host.twinx() host.set_xlabel("Time (hrs)") host.set_ylabel("Power (W)") par.set_ylabel("Temperature (C)") p1, = host.plot(self.dat.timebase1, self.dat.pwr, 'b,', label="Power", markevery= self.skip) p2, = par.plot(self.dat.timebase2, […]

如何在Linux上用Ruby 2.0改善独angular兽进程之间的内存共享

Ruby 2.0引入了一个写时复制友好的垃圾收集器。 我的进程似乎并没有让内存共享超过几分钟 – 似乎很快就会从shared_dirty转移到private_dirty。 一些其他人已经成功地获得这个工作: https://gist.github.com/kenn/5105175 http://marianposaceanu.com/articles/on-ruby-2-0-memory-usage-unicorn-and-heroku 这个程序可以用来检查Linux上的内存统计信息: https : //gist.github.com/kenn/5105061 我的麒麟configuration: https : //gist.github.com/inspire22/f82c77c0a465f1945305 出于某种原因,我的独angular兽应用程序,preload_app = true,共享内存也less得多。 Ruby 2.0-p195,rails 3.2,linux 2.6.18(centos) [root@thorn script]# ruby memstats.rb 4946 Process: 4946 Command Line: unicorn_rails worker[4] -c /u/apps/newap/current/lib/unicorn.rb -E production -D Memory Summary: private_clean 0 kB private_dirty 56,324 kB pss 60,256 kB rss 83,628 kB shared_clean 4,204 […]