标签: memory-efficient

Pthreads - 高内存使用率

我在C语言编程,在256Mb系统上在Linux中创建了很多Pthreads.我通常免费+ 200Mb.

当我使用少量线程运行程序时,它可以工作,但是一旦我创建了大约100个线程,它就会出错,因为系统内存不足.我做了几次测试,每个线程使用了近2Mb.线程的堆栈大小设置为16Kb.

我用来创建每个线程的代码:

pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stacksize;
stacksize = (double) 16*1024;
int res = pthread_attr_setstacksize (&attr, stacksize);
int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (res != 0 || res2 != 0) {
    logs << "pthread_attr_XX: error "+int2string(res);
    exit(-1);
}
pthread_t id;
pthread_create(&id, &attr, &Class::thread_callback, &some_var);
Run Code Online (Sandbox Code Playgroud)

这是正常的还是我错过了什么?谢谢.

c linux multithreading pthreads memory-efficient

8
推荐指数
1
解决办法
3177
查看次数

面向对象,数据方向,缓存污染和缓存显而易见性

在常规的面向对象实践中,并不是罕见的对象具有多个不相关的成员属性.当物体被处理时,在不同的通道中进行处理并不罕见,这些通道针对其属性的不同部分.

在这方面,创建对象集合的典型方法似乎不是非常有效的方法.考虑到计算机访问内存的方式和缓存行的平均大小,很有可能缓存内存正在填充不需要的内容,但恰好是相邻的,因此最终浪费缓存容量并增加停顿和执行的延迟.

更糟糕的是使用多态和动态分配对象的做法,没有内存池和自定义分配器.在这种情况下,不仅缓存会被不需要的数据填充,而且由于动态内存分配使用的任意地址,预取程序也无法正常工作.

拯救是回到OOP之前的时间并选择数据导向,这似乎是开发性能关键应用程序,操作系统等的首选.但为什么不使用两者的混合版本呢?排序的数据面向对象的编程

在那么久的提议之后,让我们来看看手头的问题.我没有足够大的项目来测试这个概念的效率,所以社区的理论专业知识非常受欢迎.

如果不是存储自己的数据成员的对象,它们只存储对集合的引用,其数据成员按顺序存储在它们自己的容器中,并且它们的成员方法从这些容器返回数据,这样就不需要数据结束的几率应该减少在前往CPU的路上,并且增加近期"未来"所需的数据几率.逻辑假设是这种方法将提高预取器效率,缓存命中率和使用效率,并且还将减少自动和手动并行化中涉及的延迟.

你怎么看?

后期编辑:如果我们考虑结构和类填充,应用"数据方向模式"可能会更有利,如果"模型"有一个char和一个int数据成员,以OOP方式它将被填充,这只会污染进一步缓存,但是面向数据的存储模式可以顺序存储所有chars和所有ints,没有空间和缓存浪费.

oop performance caching memory-efficient data-oriented-design

8
推荐指数
1
解决办法
369
查看次数

计算大数据集中值的内存有效方法?

如果一台计算机只能容纳100万个号码,如何找出1亿个号码的中位数?

algorithm complexity-theory computer-science median memory-efficient

7
推荐指数
1
解决办法
4231
查看次数

在一系列公共基类型中获取整数类型id的最有效方法

问题:

我有一个具有共同基础的对象族,我需要能够通过整数值来识别特定的具体类型.

有两种明显的方法可以做到这一点,但是在内存或CPU时间方面都会产生不可接受的开销.由于该项目涉及数十亿个对象,因此最微小的开销最终会发出严重的声音,而且我已经对此进行了测试,这不是过早优化的情况.处理对象所涉及的操作都是微不足道的,虚拟调用的开销极大地降低了性能.

  • 一个int type()为每种类型实现的纯虚函数,不幸的是,它带来了虚拟调用的开销,这对于返回静态整数值这样的事情是微不足道的

  • int type构造函数类型中指定的每个实例的成员,它为这些数十亿个对象中的每一个引入了4字节的开销,浪费内存,污染缓存和诸如此类的东西.

我记得前段时间有人询问"静态虚拟成员变量",自然答案归结为"不,这没有意义",但是能够将用户变量放在vtable中并且能够设置其值对于每个特定类型似乎是一个非常有效的解决我的问题.

这样就避免了上述两种开销,不需要虚拟调用,也没有每个实例的内存开销.唯一的开销是间接获取vtable,但考虑到访问该数据的频率,它很可能大部分时间都保存在cpu缓存中.

我目前显而易见的选择是做"手动OOP" - 手动执行vtables以便将必要的"元"数据合并到它们中,为每种类型初始化vtable指针并使用笨拙的语法来调用伪"成员"函数.或者甚至完全省略vtable指针的使用,而是存储id,并将其用作vtable表的索引,这将更有效,因为它将避免间接,并将缩小大小,因为我只需要2 ^ 14种不同的类型.

如果我能避免重新发明轮子那将是很好的.只要能给我效率保证,我对解决方案并不挑剔.

也许有一种方法可以在vtable中使用我的类型id整数,或者可能还有另一种方式,这很可能,因为我跟不上趋势,C++在最后几个中获得了很多新功能年份.

当然,那些id需要统一和一致,而不是编译器内部编写的任何值.如果这不是一个要求,我只是使用vtable指针值来获得避免间接的更有效的解决方案.

有任何想法吗?

c++ performance typeid vtable memory-efficient

7
推荐指数
1
解决办法
162
查看次数

高效枚举具有常和的多项式 - R

假设我有一个 N 面骰子,每一面的概率不均匀,我将其扔了 M 次。现在我们不再观察个体结果,而是只观察总和。

我必须对可能性进行编码,其中我必须对仅限于观察到的总和的多项可能性分量进行求和。

如果 N=3,M = 2 并且总和为 4,那么很明显,我必须对其中一个投掷为 1、另一个投掷为 3 的两种情况加上两者均为 2 的情况进行求和。

我还可以枚举所有可能性,计算总和并将计算限制为我感兴趣的总和的组合,但显然随着 N 和 M 的增加,这很快就会变得棘手。

所以我正在寻找一种有效的方法来选择 R 中的常和组合。

r constraints combinatorics memory-efficient

7
推荐指数
1
解决办法
187
查看次数

构建一个高效的数独求解器

是的,我知道这不是什么新鲜事,那里已经有很多问题(它甚至有自己的标签),但是我想用Java创建一个Sudoku Solver,仅仅是为了训练自己编写更多的代码.高效.

在程序中执行此操作的最简单方法可能是在每个列和行中分析大量的for循环,收集每个单元格的可能值,然后仅使用一种可能性清除单元格(无论它们是否只包含1个数字,或者它们是其行/列中唯一包含此数字的单元格,直到您有一个已解决的拼图.当然,纯粹想到这个动作应该会引起每个程序员的注意.

我正在寻找的是以最有效的方式解决这个问题的方法(请尽量不要包含太多的代码 - 我想自己想出那个部分).

如果可能的话,我想避免使用数学算法 - 那些太容易了,而且100%不是我的工作.

如果有人能够提供一个有效的思考过程来解决数独谜题(无论是通过人类还是计算机),我会非常高兴:).我正在寻找一些模糊的东西(所以这是一个挑战),但足够的信息(所以我并没有完全迷失)让我开始.

非常感谢,

Justian Meyer

编辑:

看看我的代码,我开始思考:存储这些求解状态(即数独网格)的可能性是什么.我想到了2D阵列和3D阵列.哪个可能最好?2D可能更容易从表面进行管理,但3D阵列也会提供"盒子"/"笼子"编号.

编辑:

没关系.我要去3D阵列.

java sudoku memory-efficient

6
推荐指数
1
解决办法
8810
查看次数

在TI-89上检查针刺的最佳方法

对于一个实验,我决定使用内置的程序编辑器将一个小游戏编程到我的TI-89中,但是我无法找到一种在没有明显延迟的情况下获得击键的最佳方法.目前我有:

Prgm

70?xpos
70?ypos

Loop

If getKey()=340 Then
xpos+3?xpos
PxlCrcl ypos,xpos,5,1
EndIf

If getKey()=337 Then
xpos-3?xpos
PxlCrcl ypos,xpos,5,1
EndIf

If getKey()=257 Then
Goto end 
EndIf

EndLoop
Lbl end

EndPrgm
Run Code Online (Sandbox Code Playgroud)

这会创建一个无限的游戏循环,检查是否按下了左,右或删除按钮并相应地向左或向右绘制一个圆圈或完全结束程序.然而,这种方法似乎运行得非常缓慢,我在其他演示中看到了更平稳的运动.我的方法有问题吗?如果有,我怎样才能改进它?

optimization input memory-efficient ti-basic

6
推荐指数
1
解决办法
102
查看次数

当其他数组创建例程不需要时,为什么 numpy 的 fromiter 函数需要指定 dtype?

为了提高内存效率,我一直在努力将我的一些代码从列表转换为生成器/迭代器。我发现了很多案例,我只是将我制作的列表转换为np.array带有代码模式的列表np.array(some_list)

值得注意的是,some_list通常是一个迭代生成器的列表推导式。

我正在研究np.fromiter是否可以更直接地使用生成器(而不是首先将其转换为列表然后将其转换为 numpy 数组),但我注意到该np.fromiter函数与使用的任何其他数组创建例程不同现有数据需要指定dtype.

在我的大多数特定情况下,我可以完成这项工作(主要是处理对数似然,所以 float64 会很好),但它让我想知道为什么这只是fromiter数组创建者而不是其他数组创建者所必需的。

第一次尝试猜测:

内存预分配?

我的理解是,如果您知道dtypecount,它允许为结果预分配内存np.array,并且如果您不指定可选count参数,它将“按需调整输出数组的大小”。但是,如果您不指定计数,似乎您应该能够dtype像在正常np.array调用中一样即时推断出。

数据类型重铸?

我可以看到这对于将数据重新转换为 new 很有用dtype,但这也适用于其他数组创建例程,并且似乎值得将其放置为可选但不是必需的参数。

重述问题的几种方式

那么为什么您需要指定dtype要使用的np.fromiter;或者换句话说,指定dtype数组是否要按需调整大小会带来什么好处?

与我的问题更直接相关的同一问题的更微妙版本:我知道np.ndarray当您不断调整 s 的大小时,它们的许多效率收益都会丢失,那么使用np.fromiter(generator,dtype=d)over np.fromiter([gen_elem for gen_elem in generator],dtype=d)over 有np.array([gen_elem for gen_elem in generator],dtype=d)什么好处?

python arrays numpy generator memory-efficient

6
推荐指数
1
解决办法
2186
查看次数

哪一个使用数组列表更有效?

哪一个更有效地实例化列表?

List<Type> list = new ArrayList<Type>(2);
list.add(new Type("one"));
list.add(new Type("two"));
Run Code Online (Sandbox Code Playgroud)

要么

List<Type> list = Arrays.asList(new Type("one"), new Type("two"));
Run Code Online (Sandbox Code Playgroud)

java collections list arraylist memory-efficient

6
推荐指数
1
解决办法
233
查看次数

如何从 Python 中的两对文件中获取枢轴线?

如何从两个制表符分隔的文件中获取枢轴线?,有一种使用 unix 命令从两个文件中透视行的快速方法。

如果我们有两对文件:

  • f1af1b
  • f2af2b

目标是提供一个 3 列制表符分隔的文件,其中包括:

  • f1a / f2a
  • f1b
  • f2b

f1a / f2a文件中同时出现在f1a和中的行在哪里f1b

我尝试了以下可行的方法,但如果文件非常大,则将需要大量内存来存储f1f2字典。例如具有数十亿行的文件。

import sys
from tqdm import tqdm 

f1a, f1b, f2a, f2b = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]


# Read first pair of file into memory.
with open(f1a) as fin_f1a, open(f1a) as fin_f1b:
  f1 = {s.strip().replace('\t', ' ') :t.strip().replace('\t', ' ') for s, t in tqdm(zip(fin_f1a, fin_f1b))}

with open(s2) as …
Run Code Online (Sandbox Code Playgroud)

python csv performance dictionary memory-efficient

6
推荐指数
1
解决办法
291
查看次数