【问题标题】:program freezes on creating a large numpy array程序冻结在创建一个大型 numpy 数组
【发布时间】:2021-01-12 17:11:42
【问题描述】:

我正在制作一个基于 Tkinter 的项目,其中数组大小有时会高达 10^9 甚至更多(尽管更多的可能性很小)。
早些时候我使用了一个使用循环的简单数组,但是在一个大小为 10^6 或更大的数组中花费了很多时间,所以我决定将我的方法切换到 NumPy,在大多数情况下,它给出了更好的结果,但在上述条件(大小> = 10 ^ 9),程序只是冻结(有时甚至计算机也会冻结,除了强制重启之外别无选择),这与​​简单的循环方法不同,即使对于更大的列表大小也会给出结果,但是,花费了很多时间。
我看了this,但它涉及到诸如使用堆内存、堆栈大小之类的术语,而我对这些东西知之甚少。

我不太习惯堆栈平台,因此不胜感激。

更新:我正在添加我尝试用 numpy 替换普通列表的代码块。注释行是我之前在简单列表中使用的行。

    def generate(self):
        # t is number of times we need to generate this list
        for i in range(self.t):
            self.n = randint(self.n_min, self.n_max)  # constraints
            # self.a = [0] * self.n
            self.a = np.random.randint(low=self.a_min, high=self.a_max, size=self.n)
            # for j in range(self.n):
            #     self.a[j] = randint(self.a_min, self.a_max)
            

然后将所有这些值插入到 Tkinter GUI 的输出屏幕中,
这里的 'n' 即 NumPy 数组的大小有时可以取非常高的值。

我在双启动 (win+ubuntu) 上,目前的情况是在 ubuntu 上,我分配了 500 GB 的存储空间,我的笔记本电脑的 RAM 是 8 GB。

【问题讨论】:

  • 查看导致问题的代码并了解您的计算机中有多少内存会很有帮助。
  • 另外,请查看How to Ask 和其他关于在help center 中提问的页面
  • 我已经添加了导致问题的一段代码。感谢您添加额外的资源,我会尽量遵守这些准则。

标签: python python-3.x list numpy tkinter


【解决方案1】:

您很可能内存不足,对于 numpy 中的 1e9 元素 float64 数组,仅此一项就是 8GB。此外,如果您天真地循环该数组(类似):

for item in big_numpy_arrray: 
   do_something(item)

这将永远持续下去。避免这样做,并尽可能使用 numpy 的向量操作。

【讨论】:

  • 实际上,我需要做的就是生成该数组并将其插入到输出小部件中,循环遍历该数组肯定会花费大量时间。我还在学习 NumPy,并不熟悉它的所有方法。如果这有助于指出问题,我已经添加了我的笔记本电脑规格。
  • 是的,8GB RAM 内存不足
  • 谢谢,那么我有什么可能的替代方案才能在如此大的数组中像 numpy 一样快。我阅读了有关使用堆内存的信息,但不清楚如何使用。
猜你喜欢
  • 2018-03-27
  • 1970-01-01
  • 2020-12-20
  • 2017-12-27
  • 1970-01-01
  • 2011-04-23
  • 2017-12-30
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多