因此,数据库适用于您具有不断变化的大型复杂模式的情况。您只有一个带有完整的简单数字字段的“表”。我会这样:
准备一个C / C ++结构以保存记录格式:
struct StockPrice
{
char ticker_code[2];
double stock_price;
timespec when;
etc
};
然后计算sizeof(StockPrice [N]),其中N是记录数。(在64位系统上)应该只有几百个演出,并且适合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);
现在,您可以再次从任何程序中以只读方式映射它,并且您的数据将随时可用:
file = open("my.data", READ_ONLY);
StockPrice* stocks = (StockPrice*) mmap(file, READ_ONLY);
// do stuff with stocks;
因此,现在您可以将其当作内存中的结构数组对待。您可以根据“查询”的内容来创建各种索引数据结构。内核将透明地交换数据到磁盘或从磁盘交换数据,因此会非常快。
如果希望具有某种访问模式(例如,连续日期),则最好按该顺序对阵列进行排序,这样它将按顺序命中磁盘。