我有2亿条记录,其中一些记录具有可变大小的字段(字符串,可变长度数组等)。我需要对它们执行一些过滤器,聚合等(面向分析的查询)。
我想把它们全部放在内存中(足以放入一个大盒子里),然后对它们进行线性扫描。我可以采取两种方法,我希望听到您对哪种方法更好的看法,以最大限度地提高速度:
char*
和int*
等结构数组来处理可变长度字段您会推荐哪种方式?
更新:使用C。
答案 0 :(得分:5)
不幸的答案是,"它取决于您尚未提供的详细信息" 虽然这是真的,但并不是特别有用。解决这类问题的一般建议是从最简单/最明显的设计开始,然后根据需要进行分析和优化。如果真的很重要,您可以从一些设计的一些非常基本的基准测试开始,使用您的确切数据和用例来更准确地了解您应该采取的方向。
概述一些特定的设计及其一般优点/缺点:
一个大缓冲区
char* pBuffer = malloc(200000000);
静态结构
typedef struct {
char Data1[32];
int Data2[10];
} myStruct;
myStruct *pData = malloc(sizeof(myStruct)*200000000);
动态结构
typedef struct {
char* pData1;
int* pData2;
} myStruct2;
myStruct2 *pData = malloc(sizeof(myStruct2)*200000000);
<强>流强>
其中哪些是最好的&#34;真的取决于你的具体情况......我可以想到每一个都是首选方法的情况。
答案 1 :(得分:4)
你可以使用结构,但你必须非常小心对齐和别名,当有一个可变长度的部分时,它们都需要修补。特别是,你可以不使用这样的结构数组,因为数组中的所有条目都必须是常量。
我建议使用扁平阵列方法。然后添加一个健康的抽象剂量;你不希望你的“商业逻辑”做得有点蠢蠢。
更好的是,如果您需要对整个数据集进行单线性扫描,那么您应该将其视为数据流,并将记录反序列化(复制)到适当的本机结构中,一次一个。
答案 2 :(得分:0)
“你会推荐哪种方法?”实际上都没有。有了这么多的数据,我的建议就像你的结构的链表。但是,如果您100%确定可以为所有数据分配所需的内存量(使用1个malloc调用),则使用结构数组。