从许多DF中有效地构建字典(总共> 20gb)

时间:2017-06-09 10:57:36

标签: performance pandas dictionary

我在成千上万的.parquet文件中存储了大约25gb。它们看起来像这样:

def build_id_map(self, df):
    df = df.drop_duplicates()

    def check_existence(row):
        if row['id'] not in self.id_dict:
            self.id_dict[row['id']] = [row['value']]
        else:
            if row['id'] not in self.id_dict[row['id']]:
                self.id_dict[row['id']].append(row['value'])

    df.apply(check_existence, axis=1)

每个ID本身都是唯一的,但是,一个ID可以有多个条目(具有相同和不同的值)。

我想:

  1. 高效读取.parquet文件(并行处理)并将每个文件转换为pandas数据框。
  2. 删除每个数据框中的重复ID值对(我只对唯一对感兴趣),以尽快缩小尺寸。
  3. 在所有.parquet文件/数据框架上构建一个公共表示形式,这些文件/数据框架是一个ID字典:[值]。
  4. 按值将字典合并到另一个值为键的字典。
  5. 基本上,我实现了所有这些(包括)第3步。但是,当我在每个数据框上进行迭代时,字典的构建时间太长了:

    参数' df'是步骤1的结果,即转换后的.parquet文件。该函数是类的一部分(这就是 self 的原因),并在另一个函数中调用,该函数使用多处理和8个核执行。字典本身是类的成员变量(共享对象),并且是迭代构建的。

    select s.*
    from subscription_stats s
    where s.day = (select max(s2.day)
                   from subscription_stats s2
                   where s2.year = s.year and s2.month = s.month
                  );
    

    我正在寻找一种更有效的解决方案来构建这个字典,因为目前,1个文件需要大约15秒,这对于大量文件来说太多了。

    此外,我很高兴听到有关如何有效实现第4点的想法。

0 个答案:

没有答案