如何破坏 Python 对象并释放内存

我试图迭代 100,000 个图像,捕获一些图像特征,并将生成的数据框存储在磁盘上,作为一个 pickle 文件。 不幸的是,由于 RAM 的限制,我不得不将图像分割成 20,000 的块,并在将结果保存到磁盘上之前对它们执行操作。 下面编写的代码应该在开始循环处理接下来的 20,000 个图像之前保存 20,000 个图像的结果帧。 然而 -- 这似乎并没有解决我的问题,因为内存在第一个 for 循环结束时没有从 RAM 中释放 因此,在处理第 50000 条记录时,由于内存不足错误,程序崩溃。 在将对象保存到磁盘并调用垃圾收集器后,我尝试删除它们,但是 RAM 使用率似乎没有下降。 我错过了什么? # File _ list _ 1 包含 100,000 个图像 File _ list _ chunks = list (文件 _ list_chunks,20000) 对于 count,枚举 (file _ list _ chunks) 中的 f: # 让工人池 Pool = 线程池 (64) 结果 = pool.map (get_image _ features,f) # 关闭游泳池,等待工 ……

共9个回答,已解决, 标签: python pandas memory-management out-of-memory
是否可以使用 std:: basic _ string 作为 char * 的包装?

我有第三方库,它返回 strdup (和 wcsdup 函数分别在其中创建的 char * (和 wchar _ t *)。 我想避免在代码末尾手动调用 free。 是否可以为 std:: basic _ string 编写一个分配器,以便它能够处理这个库返回的 c 字符串?理想情况下,我根本不想分配任何新内存,也不想使用返回的内存块 (字符串应该是常量)。 ……

共4个回答, 标签: c++ c++11 memory-management stl
类的实例使用什么资源?

Python (我猜是 c python) 在为新创建的类实例分配资源时的效率如何?我有一种情况,我需要数百万次实例化一个节点类来构建树形结构。每个节点对象应该 轻量级,只包含一些数字和对父节点和子节点的引用。 例如,python 是否需要为每个实例化对象的所有 “双下划线” 属性 (例如 docstring,__dict__, __repr__, __class__ 等等),或者单独创建这些属性,或者存储指向类定义它们的位置的指针?或者它是否有效,除了我定义的需要存储在每个对象中的自定义内容之外,不需要存储任何东西? ……

共4个回答,已解决, 标签: python class memory-management instance cpython
为了将对象的实例传递给 'gc.Addmemorypressure' 方法,使用了什么 C # 语言机制?

使用 C # 语言的什么机制来将对象的实例传递给GC.AddMemoryPressure方法? 我在下面的示例代码,通过 C # 的 CLR书: 私有密封类 BigNativeResource { 专用只读 Int32 m_size; 公共 BigNativeResource (Int32 大小) { M_size = size; //让 GC 认为对象在物理上更大 如果 (m_size> 0) GC.AddMemoryPressure (m_size); Console.WriteLine ("BigNativeResource create."); } ~ BigNativeResource () { //使 GC 认为对象释放了更多内存 如果 (m_size> 0) GC.RemoveMemoryPressure (m_size); Console.WriteLine ("BigNativeResource destroy."); } } 我不明白我们如何将对象的实例与其增加的压力相关联。我没有看到对象引用被传递到GC.AddMemoryPressure。我们是否将增加的记忆压力 (amp) 与 ……

共3个回答,已解决, 标签: c# memory-management garbage-collection memory-pressure
堆上有分配的变量吗?

我有一个关于内存分配主题的测验,这个问题让我困惑,因为我对答案不满意。 (问题所在 [https://i.stack.imgur.com/6p5h1.png]) 正如我所知,我们可以创造一个“对象"通过创建一个指针变量指向我们在堆上分配的内存 (使用新的关键字)。 对于一个具体的例子: 双 * a = 新的双 (-1.0 f); 变量的A是一个指针,在栈指向堆上的内存。所以实际上,说A在堆上分配是错误的。我的理解是正确的吗? ……

共2个回答,已解决, 标签: c++ memory-management
Alloca () 内存可以重新分配吗?

分配的内存malloc can be reallocated with realloc. Is there a similar function for alloca?当你不想在堆上分配内存,并且你需要多次分配可变堆栈内存时,重新分配堆栈内存可能会很有用,例如在库函数中, 需要动态内存,但不想在堆上分配的地方,因为库的用户可能会使用自定义堆分配策略。看起来是这样的: Int main (void) { * 浮 some_mem = alloca (40 * sizeof (浮点)); 用这段记忆做点什么. 现在我们需要不同数量的内存,但是有些内存仍然占据了大量的堆栈,所以只要重新分配它就可以了。 这样的事情有可能吗? Some_mem = realloca (some_mem,月 * sizeof (浮点)); } 重要的是,这一切都发生在堆栈上。问: 有没有办法重新分配动态堆栈内存? ……

共2个回答,已解决, 标签: c memory-management realloc alloca
一个对象的单例,它再次进入 ctor 访问?

我可以使用 C 11 或 C 14 (甚至 C 17)。假设我有一个单例对象 类 MyInstance { 公众: () { 抛出 std:: runtime _ exception (“出了问题”);//Ctor 可能会抛出 } }; MyInstance & getInstance () { 静态 MyInstance obj; 返回 obj; } 现在,我确保每一个电话getInstance被包裹在一个 试试 { Auto & inst = getInstance (); } 捕获 (std:: runtime _ error & e) { 做点什么 } 我现在想知道的是:如果在构造函数初始化失败后,在日志中抛出、捕获和通知用户.程序通过了再次在一个try codepath and calls getInstance又来了? 我做了一些猜测,但是我不知道它们是否正确: 这个对象有静态存储,所以我认为它只会被尝试构建?返回对未构造对象的引用会给我一个挂起的引用和未定义的行为吗?会用一个unique_ptr as static variable in place of obj solv ……

共2个回答,已解决, 标签: c++ exception memory-management unique-ptr