使用python,选项和注意事项在文件读/写中使用资源

时间:2010-11-25 02:29:35

标签: python mysql performance python-multithreading

我正在开发python,对游戏来说还是新手,我想确保我正确解决这个问题。我很乐意接受所有建议。

想象一下,尝试使用存储在多个平面文件中的数据,在许多情况下,组合大小超过20-35 GB。在最一般的情况下,这些文件可以分隔(csv,tab)或者可以简单地是固定宽度。目标是获取这些文件或每个文件的某个子集,解析输入(每列代表数据中的变量),并将其发送到某个目标(可能是本地或远程sql,其他一些本地文件)输出格式包括文本或某些专有数据格式,如stata的.dta)

目标是使用可用的系统资源以尽可能最快的方式执行此操作(我想以每秒kb为单位?)

问题:

  1. 使用编译的C进行读取操作是否会提高效率?如果是这样,我应该学习哪个库如何使用?而且,c还应该进行解析和输出吗?

  2. 如果文件是.zip或.gz文件,是否应该在读取和写入之前解压缩整个文件,还是将其压缩并使用能够从压缩文件中读取的库?

  3. 程序应该使用多线程吗?我想要读一个文件的一些子集(比如说,一次是n行),解析并输出,比方说,j个线程。一次读取一行文件是最佳的并不明显......似乎最佳线程和进程数将取决于可用资源和作业大小。
    因此,代码应该是“智能”的,足以最佳地确定要使用多少线程以及每个线程应该做多少工作。

  4. 如何衡量和比较不同方法之间的效率?

  5. 程序是否能够动态执行此操作并根据其性能选择输入输出方法? (方法A总是严格控制方法B,或者在部署环境中做特殊的改变)

  6. 为了清楚起见,我愿意接受几乎任何级别的代码效率低下,以换取资源效率的不可忽视的改进

    我希望这些问题清楚地说明我想弄清楚什么。我的编程经验主要局限于科学/统计软件包,所以如果我的任何问题归结为'rtm',请温和并建议相应的手册。

1 个答案:

答案 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,或者在部署环境中做特殊的变化)

是。是的。有些方法总是更有效率。然而,操作系统非常复杂,因此没有什么能够替代简单,灵活,组件化的设计。

构建可以灵活重组的简单部分。

请勿提前亲自动手。尽可能设计正确的数据结构和算法。当你做不到时,只需挑选一些合理的东西继续前进。构建一些东西和调整比轻松细节更容易,只是为了发现它们从未重要。

  1. 构建一些东西。

  2. 测量

  3. 找到瓶颈。

  4. 优化经过验证的瓶颈。