【问题标题】:Python program in command line or .exe gives a MemoryError, however works fine in Spyder IDE命令行或 .exe 中的 Python 程序会出现 MemoryError,但在 Spyder IDE 中可以正常工作
【发布时间】:2020-05-14 21:11:42
【问题描述】:

版本: Python 3.7 (Spyder) -- 操作系统: Windows10 -- 系统: Core i5 (6th gen) + 16gb RAM

我编写了一个处理大量数据的程序。以下结构用于完成此操作:

节目说明

  • GUI 界面用作主要功能(类)。这里弹出一个界面,要求用户输入,用这个输入进行各种计算,在不同的函数中指定。
  • 第一个功能是导入功能,在指定的(按用户)文件夹中搜索所有 .wav 文件并导入这些文件的数据。所有导入的项目都附加 (numpy.append) 到一个大数组中。
  • 大数组(对于 20 个文件,大约 2.000.000.000 个数据点)用于计算声音文件的特征。它有这么多数据点的原因是 .wav 文件的采样率设置为 78125 个样本/秒,我需要准确计算。
  • 计算后,在指定文件夹中生成 2 个图,并且 2 个 csv 与请求的数据一起存储在该文件夹中。

问题陈述

  • 在 spyder 环境中运行 main 函数(程序),完全没问题。遍历所有数据并生成输出大约需要 10 分钟。

  • 使用 PyInstaller 将函数编译为 .exe,工作正常,没有错误,所有依赖项都已导入。然而,当运行程序时,几乎立即弹出 MemoryError(见下图)。

Image: error message from command line when executing the exe file

尝试过的解决方案

  • 通过 CLI 运行 python 脚本,报同样的错误

  • 运行 .exe 程序只需要导入 2 个文件,可以处理所有文件,但速度非常慢(比通过 spyder 执行慢得多)

问题

  • 为什么spyder有足够的内存来处理所有数据没有问题,但是通过命令行执行.py或者执行.exe文件时,总是出现内存错误?
  • 为什么通过 CL 的 .exe 或 .py 运行速度比在 spyder IDE 中慢?

目标

这个程序应该能够处理公司每台笔记本电脑上的噪音数据(有时还有 8GB 内存)。所以我想找到一种方法让程序在使用过的机器上分配所有可用的 RAM。

在此先感谢您的帮助!

【问题讨论】:

  • Spyder 使用的是哪个 python 解释器?它与您通过命令行访问的相同吗?这几乎听起来像是 32 位与 64 位的问题。
  • 假设您正在运行像python your_script.py 这样的脚本,您可以通过在命令行中键入python 并按Enter 来判断它正在哪个版本下执行。这将使您进入解释器,您应该会看到类似Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32 的内容。如果是 32 位的,你在 32 位下运行脚本等等。
  • 不,命令提示符对您的脚本一无所知。它只是使用python路径环境变量指向的python版本。
  • win32 只是说平台是windows。 64 位意味着您正在运行 64 位版本。见这里stackoverflow.com/questions/17757819/…。至于针对 64 位,如果我错了,有人可以纠正我,但我相信 pyinstaller 将使用构建可执行文件的 python 版本。因此,如果您在新的 64 位版本上 pip install pyinstaller 它应该创建一个 64 位可执行文件。
  • 是的!使用新的 64 位 python 再次安装 pyinstaller(以及所有相关软件包)后,.exe 文件运行顺畅且没有任何问题。它在所有文件中运行大约 7 分钟,这与从 spyder IDE 运行相同。非常感谢,这真的很有帮助!

标签: python-3.x command-line out-of-memory exe spyder


【解决方案1】:

同时感谢Axe319,我找到了问题的答案:

Spyder IDE 运行在 64 位版本的 python 上,使程序运行流畅,没有任何问题。尽管如此,我的 python 解释器仍然是 32 位版本的 python。

解决问题的步骤:

  • 卸载python 32位版本
  • 安装python 64位版本
  • 使用 pip install 再次安装所有使用过的软件包 -packages-
  • 使用 pip install pyinstaller 再次安装 PyInstaller
  • 使用 PyInstaller 将程序编译为 .exe

这一切似乎都在工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2015-01-20
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多