我正在开发python,对游戏来说还是新手,我想确保我正确解决这个问题。我很乐意接受所有建议。
想象一下,尝试使用存储在多个平面文件中的数据,在许多情况下,组合大小超过20-35 GB。在最一般的情况下,这些文件可以分隔(csv,tab)或者可以简单地是固定宽度。目标是获取这些文件或每个文件的某个子集,解析输入(每列代表数据中的变量),并将其发送到某个目标(可能是本地或远程sql,其他一些本地文件)输出格式包括文本或某些专有数据格式,如stata的.dta)
目标是使用可用的系统资源以尽可能最快的方式执行此操作(我想以每秒kb为单位?)
问题:
使用编译的C进行读取操作是否会提高效率?如果是这样,我应该学习哪个库如何使用?而且,c还应该进行解析和输出吗?
如果文件是.zip或.gz文件,是否应该在读取和写入之前解压缩整个文件,还是将其压缩并使用能够从压缩文件中读取的库?
程序应该使用多线程吗?我想要读一个文件的一些子集(比如说,一次是n行),解析并输出,比方说,j个线程。一次读取一行文件是最佳的并不明显......似乎最佳线程和进程数将取决于可用资源和作业大小。
因此,代码应该是“智能”的,足以最佳地确定要使用多少线程以及每个线程应该做多少工作。
如何衡量和比较不同方法之间的效率?
程序是否能够动态执行此操作并根据其性能选择输入输出方法? (方法A总是严格控制方法B,或者在部署环境中做特殊的改变)
为了清楚起见,我愿意接受几乎任何级别的代码效率低下,以换取资源效率的不可忽视的改进
我希望这些问题清楚地说明我想弄清楚什么。我的编程经验主要局限于科学/统计软件包,所以如果我的任何问题归结为'rtm',请温和并建议相应的手册。
答案 0 :(得分:2)
使用编译的C进行读取操作是否可以提高效率?
不是真的。限制将是I / O带宽,Python使用底层C库。
如果文件是.zip或.gz文件,是否应该在读取和写入之前解压缩整个文件,或者是否将其压缩并使用能够从压缩文件中读取的库?
首先,让其他一切运作良好。不要试图预先做好准备。 Python的ZipFile实现可以通过打开ZIP存档成员而不扩展它们来处理CSV格式文件。
这更快吗?你不能提前知道。您只能通过构建它并测量您构建的内容来了解它。不要拧你的手。它只有几行代码。建立两者。
程序应该使用多线程吗?
没有
使用操作系统级多处理。
python something.py source.zip | python part2.py | python part3.py | python part4.py >result
这将非常快,并且 - 如果没有太多工作 - 将使用所有可用的操作系统资源。
嗯......这是一个愚蠢的问题。你构建它并测量它。经过的时间与其他任何事情一样好。如果您感到困惑,请使用秒表。认真。没有魔力。如何衡量和比较不同方法之间的效率?
程序是否能够动态执行此操作并根据其性能选择输入输出方法?
没有
(方法A总是严格控制方法B,或者在部署环境中做特殊的变化)
是。是的。有些方法总是更有效率。然而,操作系统非常复杂,因此没有什么能够替代简单,灵活,组件化的设计。
构建可以灵活重组的简单部分。
请勿提前亲自动手。尽可能设计正确的数据结构和算法。当你做不到时,只需挑选一些合理的东西继续前进。构建一些东西和调整比轻松细节更容易,只是为了发现它们从未重要。
构建一些东西。
测量
找到瓶颈。
优化仅经过验证的瓶颈。