很多年前,我制作了一个 ad hoc 脚本来获取一些数据,然后再编写另一个以进行解析。数据保存在一个大词典中,并由第一个脚本保存到一个pickle文件中,因为当时这对我来说是最简单的。此设置随时间变化,因此现在我在泡菜文件中有历史(每月)数据,每个数据都从100MiB起。这些文件中的每个数据都是一个巨大的字典。
这出奇地好,但是最近我开始遇到问题。它本可以在几个月前从计算机和操作系统升级开始的,但我不确定。我在具有64 GiB RAM的计算机上的Fedora 29上运行Python 3.7.5。在以前的机器上,它已经有10年的历史了,并且只有一半的RAM,它可以正常工作(速度有点慢)。
发生的事情是,对于某些文件,加载将永久进行,并且-如果我允许它继续进行-它将开始使计算机停止运行。杀死加载的唯一方法是 Ctrl + Z ,然后是kill -9 %1
。 Ctrl + C 不起作用。
这些文件在计算机升级之前运行良好,并且自创建以来一直没有更改。奇怪的是,某些文件可以正常工作。这与它们的大小无关(即,较大的文件可能有效,而较小的文件则无效)。它似乎也不取决于文件的年龄。例如,两个过时的文件现在使我失败了,然后其中一些开始工作(并且很快!),然后一些不起作用,等等。
我不确定这一点,但似乎并非总是相同的文件才能表现出这种行为。我有一种感觉,至少有些文件偶尔会加载(大约几秒钟),并偶尔显示这种行为。
脚本始终使用Python 3完成,并且所有的pickle文件都具有协议版本3。
加载失败的MWE实际上只是在加载:
import pickle
with open("subdir1/subdir2/file_name.pickle", "rb") as f:
d = pickle.load(f)
我在日志中没有发现磁盘错误,因此我假设文件是完整的。
我不知道该怎么做。即使我将它们转换为另一种格式,也需要加载数据才能做到这一点。
所以,问题是:这可能是什么原因造成的,更重要的是,我该怎么办?