【发布时间】: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