2017-11-12 15 views
0

xlsxファイル300GBを読む必要があります。行数〜10^9。私は1つの列から値を取得する必要があります。ファイルは8列で構成されています。私はできるだけ早くそれをやりたい。非常に大きなxlsxファイルをPythonで読む

from openpyxl import load_workbook 
import datetime 
wb = load_workbook(filename="C:\Users\Predator\Downloads\logs_sample.xlsx", 
read_only=True) 
ws = wb.worksheets[0] 

count = 0 
emails = [] 
p = datetime.datetime.today() 
for row in ws.rows: 
    count += 1 
    val = row[8].value 
    if count >= 200000: break 
    emails.append(val) 
q = datetime.datetime.today() 
res = (q-p).total_seconds() 
print "time: {} seconds".format(res) 
emails = emails[1:] 

サイクルには、200.000行を読み取るのに約16秒必要です。時間の複雑さはO(n)です。したがって、10^6の行はほぼ1.5分間読み込まれます。ビットは10^9です。そして、このためには10^3 * 1.5 = 1500分= 25時間待たなければなりません。それはあまりにも悪いです... この問題を解決するために、私を助けてください。

+0

単一のExcel .xlsxワークシートの最大行は、10億ではなく、2^20または1,048,576行にすることができます。タイトルからExcelファイルではないため、制限がないCSVファイルを間違えていると思いました。しかし、あなたは.xlsxを参照します。この壮大なワークブックを見るのが大好きです。行が複数のシートにまたがっている可能性がありますか?ファイルがExcel.exeプログラムではなくコードで構築されているのでしょうか? – Parfait

答えて

0

このようなタスクを効率的に実行するには、データベースを使用する必要があります。 Sqliteはここであなたを助けることができます。あなたがでパンダをインストールすることができ http://sqlite.org/

からhttp://pandas.pydata.org/とSQLiteの、からパンダを使用して

。ピピまたはコンディションの連続体から。

import pandas as pd 
import sqlite3 as sql 

#create a connection/db 
con = sql.connect('logs_sample.db') 

#read you file 
df = pd.read_excel("C:\\Users\\Predator\\Downloads\\logs_sample.xlsx") 

#send it to the db 
pd.to_sql('logs_sample',con,if_exists='replace') 

http://pandas.pydata.org

+0

ファイルがRAMメモリに書き込まれるため、このコード 'df = d.read_excel(" C:\\ Users \\ Predator \\ Downloads \\ logs_sample.xlsx ")'はファイル300GBで動作しません300GBよりも...)。 1つのコマンドでファイルを読むことはできません。 –

+0

ファイルを分割します。 – EM28

0

一つの可能​​なオプションは、直接.xslx内部.xmlデータを読み取ることであろう、より多くのを参照してください。

.xlsxは実際には複数のxmlファイルを含むzipファイルです。

すべての別個のメールはxl/sharedStrings.xmlにある可能性がありますので、そこに抽出することができます。

(小さいファイルで)テストするには、ファイル名に'.zip'を追加して内容を表示します。

300GBファイル全体を解凍することはオプションではないので、圧縮されたデータ(zip内のその単一ファイル)をストリーミングし、メモリ内の部分を解凍して、必要なデータを抽出する必要があります。

私はPythonを知らないので、コード例を参考にすることはできません。


また:emails.append(val)は...直接の代わりに成長し、メモリを再割り当てする必要があろう(配列に格納したファイルにこれらの値を書き込むことが良いかもしれない10億個のアイテムを配列/リストを作成します。毎回)。

関連する問題