由于以前遇到的數(shù)據(jù)文件體量都比較小,今天在使用python讀取csv文件時(shí)直接內(nèi)存溢出了。
這里特意記錄一下解決問(wèn)題的三種方式,遇到的場(chǎng)景就是使用pandas模塊直接讀取csv文件然后返回DataFrame對(duì)象結(jié)果內(nèi)存溢出。
首先,來(lái)看一下解決這個(gè)問(wèn)題的思路是什么,然后再來(lái)分析怎么解決這個(gè)問(wèn)題?
最簡(jiǎn)單的方式就是直接使用軟件工具將大文件進(jìn)行拆分,拆分完成后再進(jìn)行讀取。第二種則是在讀取大文件的過(guò)程中直接分段讀取,比如按照每十行讀取的方式直接進(jìn)行讀取操作。
再或者第三種就是使用底層處理比較優(yōu)質(zhì)的模塊,比如polars,它的底層存儲(chǔ)方式就不會(huì)發(fā)生內(nèi)存溢出的問(wèn)題。
# Importing the pandas module and giving it an alias of pd.
import pandas as pd
# Reading the csv file and returning a DataFrame object.
result_ = pd.read_csv('G:/test/data.csv')
# File "pandas\_libs\parsers.pyx", line 808, in pandas._libs.parsers.TextReader.read_low_memory
# File "pandas\_libs\parsers.pyx", line 866, in pandas._libs.parsers.TextReader._read_rows
# File "pandas\_libs\parsers.pyx", line 852, in pandas._libs.parsers.TextReader._tokenize_rows
# File "pandas\_libs\parsers.pyx", line 1973, in pandas._libs.parsers.raise_parser_error
# pandas.errors.ParserError: Error tokenizing data. C error: Expected 3 fields in line 14, saw 4542
上面就是直接讀取大數(shù)據(jù)量的csv文件會(huì)發(fā)生python內(nèi)存溢出的報(bào)錯(cuò)。
若是想繼續(xù)使用pandas模塊讀取大數(shù)量的文件,可以加上分割讀取數(shù)據(jù)的參數(shù)就不會(huì)發(fā)生內(nèi)存溢出的現(xiàn)象了。
# Reading the csv file in chunks of 10 rows.
result_ = pd.read_csv('G:/test/data.csv', chunksize=10)
chunksize設(shè)置為10,就是可以按照每十行的讀取方式來(lái)讀取csv的數(shù)據(jù),并且返回的也是DataFrame的數(shù)據(jù)對(duì)象。
然后就是采用polars模塊讀取的方式來(lái)處理大數(shù)據(jù)量csv文件,polars本身對(duì)于大數(shù)據(jù)的文件支持比較好,并且讀取速度也有很大的提升。
可以使用polars模塊一次性讀取csv文件直接返回DataFrame的數(shù)據(jù)對(duì)象。
# Importing the polars module and giving it an alias of pol.
import polars as pol
# Reading the csv file and returning a DataFrame object.
data_ = pol.read_csv('G:/test/data.csv')
# Printing the dataframe.
print(data_)
最后一種方式提前將大數(shù)據(jù)文件做完文件分割之后再進(jìn)行讀取,如果是做文件分割的話(huà)推薦一個(gè)比較好用的數(shù)據(jù)文件分割工具-EmEditor。
「Python 集中營(yíng)」,只做知識(shí)分享 !
聯(lián)系客服