數據量太大,節省內存的幾種方式算法
一、使用nrows和skip_rows來讀取。提早申明dtype和usecols,能夠節省內存空間。 train_data=pd.read_csv(train_dir,skiprows=range(1,SKIP_ROWS),nrows=TRAIN_ROWS,dtype=dtypes,usecols=use_cols) 二、若是要兼顧內存和速度。可使用reader來分塊閱讀。在建立reader的時候,並無真正讀取數據,等到for循環的時候纔讀取。 train_reader=pd.read_csv(train_dir,iterator=True,chunksize=chunk_size,dtype=dtypes,usecols=use_cols) 在for循環中,才真正讀取數據。 for chunk in train_reader : train_data=pd.concat([train_data,chunk],ignore_index=True) 三、要善用垃圾回收,及時刪除不須要的變量 del test_data gc.collect() 四、對數據進行類型轉換,及時減小內存。 train_data[col_name]=train_data[col_name].astype('uint8') 五、轉換數據格式 使用其它格式能加速數據載入而且下降內存佔用。好的選擇像 GRIB、NetCDF、HDF 這樣的二進制格式。 有不少命令行工具能幫你轉換數據格式,並且不須要把整個數據集載入內存裏。換一種格式,可能幫助你以更緊湊的形式存儲數據,節省內存空間;好比 2-byte 整數,或者 4-byte 浮點。 6. 流式處理數據,或漸進式的數據加載 全部數據若是不須要同時出如今內存裏,能夠用代碼或庫,隨時把須要的數據作流式處理或漸進式加載,導入內存裏訓練模型。這可能須要算法使用優化技術迭代學習,好比使用隨機梯度降低。那些須要內存裏有全部數據、以進行矩陣運算的算法,好比某些對線性迴歸和邏輯迴歸的實現,就不適用了。 好比,Keras 深度學習 API 就提供了漸進式加載圖像文件的功能,名爲 flow_from_directory 另外一個例子式 Pandas 庫,可批量載入大型 CSV 文件。 7. 使用關係數據庫(Relational database) 關係數據庫爲存儲、訪問大型數據集提供了標準化的方法。 在內部,數據存在硬盤中,能漸進式地 in batch 批量加載,並使用標準檢索語言 SQL 檢索。 像 MySQL、Postgres 這樣的開源數據庫工具,支持絕大多數的(所有?)編程語言。許多機器學習工具,都能直接與關係數據庫連通。你也能夠用 SQLite 這樣更輕量的方法。這種方法對大型表格式數據集很是有效率。