【问题标题】:Storing and analysing experimental data in efficient way (SQL, PYTHON) [closed]以有效的方式存储和分析实验数据(SQL,PYTHON)[关闭]
【发布时间】:2016-06-29 18:54:03
【问题描述】:

我目前在我所在大学的神经科学研究实验室担任本科实习生,在那里我是专门的“编码员/数学专家”。我知道这种描述令人毛骨悚然,但我认为这就是我的看法。

我有许多任务,包括更新遗留代码,这使我退后一步,并尝试将最佳方法概念化。我正在寻找有关构建流程的最佳方式的建议。

目前收集的数据来自两种形式。一种来自基于 3d 的捕获设备,该设备收集不同标记上的数据,最显着的是它们的 xyz 位置,它可以将这些数据导出为 CSV。然而,还有一个用 C 语言编写的奇怪的旧 API,我可以用它来手动获取数据。 还有一个眼动仪,它以专有的二进制格式存储其数据,并提供一个 MEX 文件以在 Matlab 中提取相关信息,但是编译后的 MEX 文件似乎完全是黑盒的。

我正在考虑尝试将所有数据存储在关系数据库中,并使用 python 插件获取所需的数据并在某些数据帧中构建以进行分析。我们说的是 100,000 * 10 of 64floating 用于 3d 动作捕捉。

是否值得研究 SQL 和 NOSQL 架构,或者我应该只将 HDF5 或 JSON 中的所有内容存储在结构化目录中?

【问题讨论】:

  • 您的问题可能会被关闭,因为它要么太宽泛,要么需要推荐。但是,标准 SQL 数据库和 NOSQL 都可以毫无问题地处理一百万个点。
  • 有那么广泛吗?我的意思是它很软,但它不像我要一个教程或任何东西。我知道两者都可以处理大量数据,我更多的是询问采用的最佳结构。
  • 我认为这将取决于您希望如何使用/处理您的数据。每天存储 100 万行新行对于这两种方法都不是问题。如果您选择 SQL,我建议您对数据进行分区,以便表保持可维护性。

标签: python mysql sql database pandas


【解决方案1】:

我问自己同样的问题,我将尝试恢复我发现的内容。

鉴于这与您的数据集相似:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 100000 entries, 0 to 99999
Data columns (total 10 columns):
0    100000 non-null float64
1    100000 non-null float64
2    100000 non-null float64
3    100000 non-null float64
4    100000 non-null float64
5    100000 non-null float64
6    100000 non-null float64
7    100000 non-null float64
8    100000 non-null float64
9    100000 non-null float64
dtypes: float64(10)
memory usage: 8.4 MB

您的“基本”数据集将需要 ≈ 10 MB

一般视图

所以 HDF5 是一种罕见的产品,它在两个领域都表现出色:存档和 根据严格的标准化约定共享数据,以及 用于本地数据分析的临时、高度灵活和迭代使用。

https://hdfgroup.org/wp/2015/03/hdf5-as-a-zero-configuration-ad-hoc-scientific-database-for-python/

通常,HDF5 与 int 相比,与 string 相比效果更好,这似乎是你的情况。也许它的主要限制是并发性:

更令人担忧的是最近在邮件列表上发布的讨论 在高性能计算应用程序中使用 netCDF 和 HDF5 数以千计的处理器使用并行 I/O,警告危险 如果客户端死在并行 I/O 期间文件损坏 特定的时间。 HDF 集团意识到了这个问题,并且 解决它。

https://earthdata.nasa.gov/standards/hdf5

看导入效率

示例 1:

如结果所示,从HDF5导入数据的时间为 最短,仅约 50% 的 CSV 导入时间和约 25% 的导入时间 来自 SQLITE。 https://statcompute.wordpress.com/tag/hdf5/

示例 2:

In [18]: %timeit test_sql_read()
1 loops, best of 3: 766 ms per loop

In [19]: %timeit test_hdf_fixed_read()
10 loops, best of 3: 19.1 ms per loop

In [20]: %timeit test_hdf_table_read()
10 loops, best of 3: 39 ms per loop

HDF5 - concurrency, compression & I/O performance

SQL

适合:

– 您的数据是结构化的(您有一个“架构”)

– 关系型(行和列的表)

– 中型,总共 几 GB

--事务性操作(保证DB一致)

https://www.nersc.gov/assets/Uploads/09-Databases-Wahid2.pdf

在之前的 SO 讨论中:

SQLite 具有支持使用 SQL 进行数据库查询的功能。 HDF5有 支持大型科学数据集的功能。 Evaluating HDF5: What limitations/features does HDF5 provide for modelling data?

但是 Pandas(从 HDF5 到 PyTables)具有丰富的“查询”能力,最近它们包含了类似 SQL 的查询。

In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

http://pandas.pydata.org/pandas-docs/stable/indexing.html#the-query-method-experimental

NOSQL

关于 HDF5 与 NOSQL 的一些见解

  • HDF5 没有数据库。 MongoDB 具有 ACID 属性,而 HDF5 没有(可能很重要)。
  • HDF5(除非您使用 MPI 版本)不支持并发写访问(可以进行读访问)。

What is a better approach of storing and querying a big dataset of meteorological data

结论

确实,对于某些应用程序而言,数据库管理系统并非如此 合理:

  • 如果所有数据集都很小,
  • 如果数据存储和访问要求不会改变(不需要灵活性)。

http://www.barrodale.com/docs/Why%20don't%20scientists%20use%20databases.pdf

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多