2017-08-01 82 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