2

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

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

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

问题:

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

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

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

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

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

需要明确的是,我愿意接受几乎任何级别的代码效率低下,以换取资源效率的不可忽略的改进

我希望这些问题能让我清楚地了解我想要弄清楚的事情。我的编程经验主要限于科学/统计软件包,所以如果我的任何问题归结为“rtm”,请温和并建议适当的手册。

4

1 回答 1

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. 优化已证实的瓶颈。

于 2010-11-25T03:45:12.900 回答