假设有很多(大约300,000个)JSON文件需要花费很多时间(大约30分钟)才能加载到Python对象列表中。分析显示它实际上不是文件访问而是解码,这占用了大部分时间。有没有我可以将这些文件转换为的格式,可以更快地加载到python的对象列表中?
我的尝试:我将文件转换为ProtoBuf(又名Google的 Proto col Buf fers)但即使我得到了非常小的文件(缩小到原始大小的20%),加载它们的时间并没有显着改善(加载它们的时间仍然超过20分钟)。
答案 0 :(得分:2)
您可能会在转换时查找错误的方向,因为它可能不会像您希望的那样减少加载时间。如果解码花费了很多时间,那么从其他格式开始可能还需要相当长的时间,假设JSON解码器写得不是很糟糕。我假设标准库函数具有不错的实现,并且JSON不是速度快的数据存储的糟糕格式。
您可以尝试使用PyPy运行程序,而不是我假设您正在使用的默认CPython实现。 PyPy可以极大地减少执行时间。它有一个更快的JSON模块并使用JIT可以加速你的程序很多。
如果您使用的是Python 3,您还可以尝试使用ProcessPoolExecutor同时运行文件加载和数据反序列化/解码。您将不得不尝试并发度,但一个好的起点是您的CPU核心数量,您可以减半或加倍。如果你的程序等待很多I / O,你应该运行更高程度的并发性,如果I / O的程度较小,你可以尝试减少并发性。如果您编写每个执行程序以便将数据加载到Python对象中并简单地返回它们,那么您应该能够显着减少加载时间。请注意,您必须使用流程驱动的方法,使用线程将无法使用GIL。
您还可以使用faster JSON library,这可以在最佳情况下将执行时间加快两到三倍。在实际使用案例中,加速可能会更小。 请注意,这些可能不适用于PyPy,因为它使用了替代的CFFI实现,并且无法与CPython程序一起使用,并且PyPy无论如何都有一个好的JSON模块。
答案 1 :(得分:0)
试试ujson
,它的速度要快得多。
"解码占用大部分时间"可以看作"构建Python对象需要花费所有时间"。你真的需要所有这些东西作为RAM中的Python对象吗?它一定很多。
我考虑使用适当的数据库,例如查询这样大小的数据。
如果您需要不同类型的批量处理,例如统计数据或矩阵处理,我看一下pandas
。