【发布时间】:2015-12-20 22:28:56
【问题描述】:
我在 Netezza 服务器上的表中有大约 2M 行 x 70 列的数值和分类数据,我想使用 Python 将其转储到 .txt 文件中。 我过去用 SAS 做过这个,在我的测试用例中,我得到了一个价值 450MB 的 txt 文件。 我使用 Python 并尝试了几件事。
# One line at a time
startTime = datetime.datetime.now().replace(microsecond=0)
cnxn = pyodbc.connect('DSN=NZ_LAB')
cursor = cnxn.cursor()
c = cursor.execute("""SELECT * FROM MYTABLE""")
with open('dump_test_pyodbc.csv','wb') as csv:
csv.write(','.join([g[0] for g in c.description])+'\n')
while 1:
a=c.fetchone()
if not a:
break
csv.write(','.join([str(g) for g in a])+'\n')
cnxn.close()
endTime = datetime.datetime.now().replace(microsecond=0)
print "Time elapsed PYODBC:", endTime - startTime
>>Time elapsed PYODBC: 0:18:20
# Use Pandas chunksize
startTime = datetime.datetime.now().replace(microsecond=0)
cnxn = pyodbc.connect('DSN=NZ_LAB')
sql = ("""SELECT * FROM MYTABLE""")
df = psql.read_sql(sql, cnxn, chunksize=1000)
for k, chunk in enumerate(df):
if k == 0:
chunk.to_csv('dump_chunk.csv',index=False,mode='w')
else:
chunk.to_csv('dump_chunk.csv',index=False,mode='a',header=False)
endTime = datetime.datetime.now().replace(microsecond=0)
print "Time elapsed PANDAS:", endTime - startTime
cnxn.close()
>>Time elapsed PANDAS: 0:29:29
现在大小: Pandas 方法创建了一个 690MB 的文件,另一种方法创建了一个 630MB 的文件。 速度和尺寸似乎有利于前一种方法,但是,从尺寸上看,这仍然比原始的 SAS 方法大得多。 关于如何改进 Python 方法以减小输出大小的任何想法?
编辑:添加示例--------------------
好的,看起来 SAS 在管理整数方面做得更好,这是有道理的。我认为这是造成尺寸差异的主要原因。
SAS: xxxxxx,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.49,40.65,63.31,1249.92。 ..
熊猫: xxxxxx,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,2.49,40.65,63.31,1249.92. ..
fetchone(): xxxxxx,0.00,0.00,0,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,2.49,40.65,63.31,1249.92. ..
编辑 2:解决方案------------------------------------
我最终删除了不必要的小数:
csv.write(','.join([str(g.strip()) if type(g)==str else '%g'%(g) for g in a])+'\n')
这将文件大小降低到 SAS 级别。
【问题讨论】:
-
看来你需要所有说明尺寸的描述。事后可以不压缩吗?
-
我该怎么做?
-
您考虑压缩方法吗?例如,您可以使用以下压缩方式之一:link
-
好的,澄清一下:目前,我正在尝试弄清楚是否有办法在不使用压缩的情况下减小文件大小。
标签: python pandas io pyodbc netezza