我应该使用数据库来处理大量结果吗?

计算科学 软件 可视化 数据分析
2021-12-24 09:42:07

背景:

我目前正在进行大量参数变化实验。它们使用 numpy 在 Python 2.6+ 中运行。这些实验将需要大约 2 周的时间来运行。

粗略地说,我在一系列值上改变了 3 个参数(自变量)。我正在修复 6 个进一步的自变量(目前)我正在报告 4 个因变量。

我改变的参数之一是分布在多个进程(和计算机)中。对于这些参数中的每一个,我都会生成一个单独的csv文件,其中每一行都包含所有变量的值(包括独立变量、固定变量和相关变量)。在所有变体中,预计会生成大约 80,000 行数据

大多数时候,我只查看一个因变量的值,但我保留其他因变量的值,因为它们可以解释发生意外情况时发生的情况。

在这个实验的早期版本中,只改变了 2 个参数(每个参数只有 2 个值csv) .在MS-Excel中做一些尴尬的事情让我按公式排序。这对于我拥有的 6 个实验结果集来说已经足够痛苦了。到本次运行结束时,我将获得 2 个数量级以上的结果。

问题:

我想一旦完成,我可以将csv文件中的所有结果转储到数据库中,并查询出有趣的部分。然后将这些结果放入电子表格中进行分析。制作图表,查找相对于控制结果的得分等

我的想法是否正确?(这就是人们所做的吗?)

这些天我的数据库 foo 相当生锈,即使我使用 MS-Access 很好。我也打算为此使用 MS-Access。

4个回答

我会建议一个完整的数据库对于您的目的来说可能是多余的,尽管它肯定会起作用。即使是行也应该不超过 25mb 左右的数据。5105

我强烈建议您使用与查询数据相同的工具进行分析/绘图/等。根据我的经验,当更改要分析的内容只需要更改 1 行代码并等待 2 秒时,更容易充分利用您的数据。复制粘贴也很容易出错。我见过几个人因为他们的数据没有意义而绝望,只是意识到他们在复制 Excel 表中的数据时犯了一个错误。

如果您完全熟悉 python,我建议您使用pandas或(如果您的数据超出内存容量)pytables,这将为您提供数据库的所有优势(包括速度)。Pandas 有很多用于绘制和分析数据的实用程序函数,您也将拥有完整的科学 Python 堆栈。看一下这个 ipython 笔记本,了解 pandas 的使用示例。

我相信 R 存在类似的工具,以及 Matlab 或 Stata 等商业软件。

HDF5 是一种很好的初始存储数据的通用方式,并且在多种语言中具有良好的库支持。

我强烈建议为此使用Sumatra等工具。我曾经有一个与你类似的“行人”方法来跟踪许多具有不同参数的模拟运行,但最终它变得一团糟,因为几乎不可能预先正确设计这种临时方法并预测所有需要的用例和扩展(例如,如果您需要引入额外的参数会发生什么)。

Sumatra 跟踪您的所有模拟运行并将它们存储在数据库中,以后可以查询(使用其 Python API)以过滤和分析您感兴趣的记录。它非常灵活,不会强加工作流程给您,我觉得这是一个很大的优势。此外,它还带有一个 Web 界面,可让您快速浏览结果(或检查/下载生成的文件),这非常有用。默认数据库使用 SQLite,我可以想象如果您使用它来存储 80,000 多个模拟结果,它会变得有点慢。有一个 PostgreSQL 后端,但我从未使用过它,所以不能保证它的性能。

我应该说它仍处于早期开发阶段,并且缺少一些东西,但在过去的一年中,我几乎将它用于所有的模拟,它为我节省了很多次,以至于我无法想象没有它我会怎么做。就个人而言,我从未将它用于跨不同计算机(或集群)的计算,但我认为它支持这种工作流程。如果您不确定或找不到您需要的确切内容,请在邮件列表中询问,这是一个很小但非常友好和乐于助人的社区。

如果您对此感兴趣,请给我留言,我很乐意分享我的工作流程和样板代码,让您继续前进(或只是为了获得灵感)。

对于实际的数据分析,我同意 LKlevin 的观点,即 pandas 和 IPython notebook 是非常有用的了解工具(Sumatra 允许您将记录导入 pandas,虽然目前有点,但我相信它会很快得到改进)。我还可以想象将数据/模拟结果保存为 HDF5 格式可能会很有用,在这种情况下,pytables 是工具箱中的一个很好的工具。(我似乎记得苏门答腊计划支持 HDF5,但我现在找不到信息,我不确定这是否已实现。)

最后,我确信还有其他工具可以帮助完成这些类型的任务(请参阅此演示幻灯片上的“短名单” )。但就我个人而言,我没有尝试过任何这些,因为我对 Sumatra 提供的功能和灵活性非常满意。

是的,您可以将所有结果转储到数据库中,是的,有些人选择使用数据库。我还没有处理使用数据库的情况,但我曾在其他讲师教授使用数据库收集数据的研讨会上授课。据我了解,对于规模不大的数据库,底层技术并不重要。我的合作讲师使用了 SQLite3。它很容易在 Linux 中安装,在 OS X 中是标准配置,而且我相信它适用于 Windows。

在 OS X 和 Linux 中可以通过终端访问 SQLite 数据库;我不确定它是如何在 Windows 上完成的。也可以利用 Python 包以编程方式读取和写入数据库,例如,使用 Python 标准库中的 sqlite3 包。

如果您的数据集变得非常大,其他数据库实现会更好,此时您可能需要咨询数据库专家。

如果您的所有数据都适合内存(例如,低于 1 GB,因此您有分析余地),那么数据库就大材小用了。您可以读取内存中的整个文件并选择所需的部分。另一方面,当您的数据开始增长(或可能变得太大)时,数据库可以为您提供快速简便的查询(“给我能量正好为 2 且温度大于 27 的所有速度”)。

另一个主题是数据的生成。由于您的数据需要两周时间,我假设您在计算集群上并行生成它们。为并行写入设置数据库很复杂,并且可能会减慢该过程,因为正在传输数据并且锁定已到位。由于您只需要编写一次内容,因此您可以让每个进程生成自己的临时文本文件,将结果写入那里,然后让中央进程读取每个文件并将其转储到主数据库中。对于最简单的情况,这个脚本可以是一个简单的cat,并将结果保存为纯文本。

现在,假设您要使用数据库。如果您的用例比文本文件稍微高级一些(如果您使用 Numpy 加载了 CSV,您会做什么),我建议通过 PyTables 使用 HDF5。它快速、易于设置、支持 Numpy,并且如果您想调整事物,它还具有许多高级功能。它还支持压缩、查询和保存数组。它也很容易安装在 Linux、Windows 和 Mac 中。HDF5 数据布局只不过是表格,就像电子表格一样。.h5如果安装了正确的库,则可以从多种计算机语言中读取生成的文件。

另一方面,您有 SQL。您在 Python 的 stdlib 中有一个,因此您应该已经安装了它,但它不太适合数值工作(例如,您不能如此轻松地保存和恢复 Numpy 数组)。如果您需要第三方与其他语言交互,这是最好的选择,因为它是众所周知的,并且几乎所有语言都有包装器,其中许多是默认提供的。