python pandas HDFStore追加不大小的数据

时间:2017-11-05 07:33:52

标签: python pandas dataframe bigdata hdfstore

我正在使用带有pandas和HDFStore的python 2.7

我尝试处理一个大数据集,它适合磁盘但不适合内存。

我将大型数据集存储在.h5文件中,每列中数据的大小不是常量,例如,一列可能在一行中包含5个字符串,在字符串中包含20个字符串另一个。

所以我在迭代中将数据写入文件时遇到问题,当第一次迭代包含一小部分数据并且下面的批次包含更大的数据时。

我发现问题是min_size未正确使用且数据不适合列,我使用以下代码将数据库缓存到h5中而没有错误

colsLen = {}
        for col in dbCols:
            curs.execute('SELECT MAX(CHAR_LENGTH(%s)) FROM table' % col)
            for a in curs:
                colsLen.update({col: a[0]})

        # get the first row to create the hdfstore
        rx = dbConAndQuery.dbTableToDf(con, table, limit=1, offset=0) #this is my utility that is querying the db 
        hdf.put("table", table, format="table", data_columns=True, min_itemsize=colsLen)

        for i in range(rxRowCount / batchSize + 1):
            rx = dbConAndQuery.dbTableToDf(con, table, limit=batchSize, offset=i * batchSize + 1)
            hdf.append("table", table, format="table", data_columns=True, min_itemsize=colsLen)

        hdf.close() 

问题是:如果我无法提前查询每列数据的最大大小,我该如何使用HDFStore?例如,由于内存约束而在迭代中获取或创建数据。

我发现我可以在磁盘数据帧中使用dask处理数据,但它缺少pandas中需要的一些功能,所以主要的想法是批量处理数据,并将其附加到现有的HDFStore文件中。

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现问题是hdf优化数据存储并依靠每列最大值的大小,

我找到了两种解决方法: 1.Pre查询数据库以获取每列的最大数据字符长度 2.将每个批处理插入到文件中的新密钥然后它可以工作,每个批处理将使用它的最大值作为列中的最大值插入到hdf文件中