【发布时间】:2015-05-13 21:47:58
【问题描述】:
我的问题都是关于提示和技巧的。我目前正在做一个项目,我有一个非常大(~1Gb)的数据文件。首先,我需要提取数据。此提取需要 10 分钟。然后我进行计算。下一个计算取决于上一个。我们称它们为计算 1、计算 2 等等。假设我已经正确完成了提取部分,我目前面临两个问题:
- 每次我启动程序时,它至少工作 10 分钟。我无法避免,所以我必须计划调试。
- 下一次计算需要更多时间。
想到第一个问题,我假设,如果数据库比读取文件更快,某种数据库可能会有所帮助,我对此表示怀疑。
如果我将我的大程序拆分为多个小程序,则第二个问题可能会得到解决,每个小程序都可以:读取文件-执行内容-写入文件。所以下一阶段总是可以从以前的文件中读取文件,进行调试。但它为文件 I/O 引入了许多浪费的代码。
我认为这两个问题都可以通过某种策略来解决,例如:编写和测试提取模块,然后启动它并将所有数据提取到 RAM 中。比编写计算 1,然后启动它以某种方式直接从提取模块的 RAM 中获取数据。以此类推,每次下一次计算。所以我的问题是:
- 是否有最小化文件负载的提示和技巧?
- 有没有办法在程序之间共享 RAM 和对象?
顺便说一下,我在 Perl 上编写此任务是因为我需要它快,但我稍后会在 C++ 或 C# 上重写它,因此欢迎任何特定于语言或与语言无关的答案。
谢谢!
[编辑]
数据文件不会改变,它就像一个不可变的大知识源。而且它不完全是 1Gb,读取它不需要 10 分钟。我只是想说,那个文件很大,阅读它的时间很长。在我的机器上,1 Gb 读取+解析文件到正确的对象大约需要一分钟。这仍然很糟糕。
[/编辑]
【问题讨论】:
-
考虑对文件进行 gzip 压缩以权衡 CPU 以减少 IO。另外,有多少列?数据是变化的还是稳定的?运行 memcached 的本地副本?或者将文件映射到内存?这完全取决于你到底在做什么。
-
考虑管道架构。一个线程读取数据;当读取到足够的数据时,它会唤醒计算线程。计算获取数据并产生结果。它发送或通知结果的“写入”线程。写入线程输出结果。请记住,这三项活动是“同时”发生的。就像通过管道推东西一样。
-
最快的解决办法是再买 16GB 的内存并运行 ramdisk
-
尝试在提取阶段分析您的代码。它将帮助您确定需要这么长时间的原因。 Devel::NYTProf 是当今 perl 分析器的黄金标准。
-
这听起来像是将您的数据导入数据库(如 MySQL)的不错选择,这将允许您将数据加载到内存中,正确设置索引,并且可以从多个进程/语言访问。
标签: c++ database perl optimization file-io