gpt4 book ai didi

database - 如何存储 73 亿行行情数据(优化以供读取)?

转载 作者:太空狗 更新时间:2023-10-30 01:37:25 24 4
gpt4 key购买 nike

我有一个包含 1998 年以来 1000 只股票的 1 分钟数据的数据集,总计大约 (2012-1998)*(365*24*60)*1000 = 73 亿 行。

大多数 (99.9%) 时间我只会执行请求。

将这些数据存储在数据库中的最佳方式是什么?

  • 1 个 7.3B 行的大表?
  • 1000 个表(每个股票代码一个),每个表有 730 万行?
  • 有什么推荐的数据库引擎吗? (我打算使用 Amazon RDS 的 MySQL)

我不习惯处理这么大的数据集,所以这对我来说是一个很好的学习机会。我将非常感谢您的帮助和建议。

编辑:

这是一个示例行:

'XX', 20041208, 938, 43.7444, 43.7541, 43.735, 43.7444, 35116.7, 1, 0, 0

第 1 列是股票代码,第 2 列是日期,第 3 列是分钟,其余为开盘价-高-低-收盘价、成交量和 3 个整数列。

大多数查询会像“给我 2012 年 4 月 12 日 12:15 到 2012 年 4 月 13 日 12:52 之间的 AAPL 价格”

关于硬件:我计划使用 Amazon RDS,所以我对此很灵活

最佳答案

因此,数据库适用于具有不断变化的大型复杂模式的情况。您只有一个“表”,其中包含大量简单的数字字段。我会这样做:

准备一个 C/C++ 结构来保存记录格式:

struct StockPrice
{
char ticker_code[2];
double stock_price;
timespec when;
etc
};

然后计算 sizeof(StockPrice[N]),其中 N 是记录数。 (在 64 位系统上)它应该只有几百 gig,并且适合 50 美元的 HDD。

然后将文件截断到该大小并 mmap(在 linux 上,或在 windows 上使用 CreateFileMapping)将其放入内存:

//pseduo-code
file = open("my.data", WRITE_ONLY);
truncate(file, sizeof(StockPrice[N]));
void* p = mmap(file, WRITE_ONLY);

将 mmaped 指针转换为 StockPrice*,并传递填充数组的数据。关闭 mmap,现在您的数据将位于一个文件中的一个大二进制数组中,稍后可以再次进行 mmap。

StockPrice* stocks = (StockPrice*) p;
for (size_t i = 0; i < N; i++)
{
stocks[i] = ParseNextStock(stock_indata_file);
}
close(file);

您现在可以从任何程序再次以只读方式对其进行 mmap,您的数据将随时可用:

file = open("my.data", READ_ONLY);
StockPrice* stocks = (StockPrice*) mmap(file, READ_ONLY);

// do stuff with stocks;

所以现在您可以将其视为内存中的结构数组。您可以根据您的“查询”是什么来创建各种索引数据结构。内核将透明地处理数据与磁盘之间的交换,因此速度会非常快。

如果您希望有特定的访问模式(例如连续日期),最好按该顺序对数组进行排序,以便它按顺序访问磁盘。

关于database - 如何存储 73 亿行行情数据(优化以供读取)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com