我正在与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
在另一个问题中建议的解决方案使得加入泡菜的速度相当慢。