使用python优化/最小化数据库表的本地副本(目前使用Pickle)

时间:2016-10-14 10:41:04

标签: python postgresql serialization pickle

我正在与RedShift上托管的数据库建立连接,并希望以pickle file(或任何其他方式)在本地保存表,以节省时间。

当我保存 100k记录时,它会占用 163 MB 的空间和 ~1400万的记录总数,所以它会为整个表格提供 165 GB

我的一位同事通过.rds将该表保存为R个文件,而且整个1400万条记录只花了 ~500 MB

如何在python中节省空间并加快速度?为什么rds格式占用如此低的空间?

以下是我的代码示例(使用Python 2.7.11,cPickle,protocol = cPickle.HIGHEST_PROTOCOL)

def write_pickle(folder, filename, my_obj, overwrite = False):
    filepath = os.path.join(folder, filename)
    if overwrite:
        print('Writing into pickle file...')
        with gzip.open(filepath, 'wb') as handle:
            pickle.dump(my_obj, handle, protocol=cPickle.HIGHEST_PROTOCOL)
    else:
        if os.path.isfile(filepath) == False:
            print('Writing into pickle file...')
            with gzip.open(filepath, 'wb') as handle:
                pickle.dump(my_obj, handle, protocol=cPickle.HIGHEST_PROTOCOL)

connection_obj = form_connection_obj()
cursor = connection_obj.cursor()
cursor.execute('SELECT TOP 100000 * FROM my_dataset;')

write_pickle('folder', 'filename.p', list(cursor.fetchall()))

更新1 :从cPickle转换为pickle并使用HIGHEST_PROTOCOL缩小为一半(100k记录为~83 MB)但是与R对应物相比仍然非常大。

更新2:使用gzip后,大小减少了(对于100k记录大约为17 MB),但它仍然是R .rds格式的3倍以上且速度也慢了

这个问题与建议之后的略有不同

1)我并不关注使用pickle,我只想拥有一个本地数据转储,以避免每次都进行远程数据库连接。

2)我想找到最好的方法(它可能甚至不涉及在本地转储表)。

3)使用gzip在另一个问题中建议的解决方案使得加入泡菜的速度相当慢。

0 个答案:

没有答案