2017-08-01 67 views
0

我有一个18GB的csv文件从测量,并希望做一些基于它的计算。我试图用熊猫来做,但似乎永远只是读取这个文件。python:如何读取和处理18GB的csv文件?

以下代码是我所做的:

df=pd.read_csv('/Users/gaoyingqiang/Desktop/D989_Leistung.csv',usecols=[1,2],sep=';',encoding='gbk',iterator=True,chunksize=1000000) 
df=pd.concat(df,ignore_index=True) 

U1=df['Kanal 1-1 [V]'] 
I1=df['Kanal 1-2 [V]'] 

c=[] 
for num in range(0,16333660,333340): 
    lu=sum(U1[num:num+333340]*U1[num:num+333340])/333340 
    li=sum(I1[num:num+333340]*I1[num:num+333340])/333340 
    lui=sum(I1[num:num+333340]*U1[num:num+333340])/333340 
    c.append(180*mt.acos(2*lui/mt.sqrt(4*lu*li))/np.pi) 
    lu=0 
    li=0 
    lui=0 

phase=pd.DataFrame(c) 
phase.to_excel('/Users/gaoyingqiang/Desktop/Phaseverschiebung_1.xlsx',sheet_name='Sheet1') 

反正是有加快进程?

+0

是否需要生成一个单一的海量excel文件?你确定excel可以阅读吗? – mdurant

回答

0

您正在以1,000,000块读取它,然后将其拼接成一个巨大的df,然后对其进行处理。读一个块会更快,处理它(写它?),然后读下一个块?


在回答您的意见,当你

df_chunks = pd.read_csv(..... chunksize=1000000) 

你得到一个pandas.io对象(或类似的东西)

我敢肯定,你可以这样做:

for chunk in df_chunks: 
    # do something, eg.. 
    U1=df['Kanal 1-1 [V]'] 
    I1=df['Kanal 1-2 [V]'] 

    c=[] 
    for num in range(0,16333660,333340): 
     lu=sum(U1[num:num+333340]*U1[num:num+333340])/333340 
     li=sum(I1[num:num+333340]*I1[num:num+333340])/333340 
     lui=sum(I1[num:num+333340]*U1[num:num+333340])/333340 
     c.append(180*mt.acos(2*lui/mt.sqrt(4*lu*li))/np.pi) 
     lu=0 
     li=0 
     lui=0 

    phase=pd.DataFrame(c) 
    # append phase to a csv file (i'd have to google how to do that but I'm sure you can) 

如果你围绕SO搜索,有几个话题,例如: How to read a 6 GB csv file with pandas

+0

你能告诉我如何在块中读取它并处理它吗? –

+0

我读了如何阅读一个6 GB的csv文件与熊猫,我不知道过程(大块)是什么意思,它似乎是块本身不是一个熊猫DataFrame的权利? –

0

您需要确保您正在有效地使用系统资源。如果你可以使用分布式计算系统,如星火它会更容易解决内存问题,否则,请按照下列步骤操作:

  • 首先要做的就是确定你的系统有多少内存,然后tweek chunksize尽可能使用可用内存的参数。

  • 您也可以调查使用hdf5格式旨在使处理大于可用内存的数据集。该文档可以找到here。 此外,如何使用hdf5与熊猫的解释可以找到here

+0

即使你使用火花,你也需要确保你有效地使用资源:) – mdurant

+0

@mdurant当然:) – MedAli