我正在運行一個生成n-gram的文本機器學習算法。這當然會大量地擴大輸入的大小。把它放在上下文中,原始輸入是在一個文件中約30K行,在生成三元素之後,我有348000個條目。Python可以使用硬盤作爲額外的內存嗎?
我使用scikit
及其TfidfVectorizer
,如果給出的值太多,我會得到由numpy數組拋出的MemoryError
。在我達到極限之前,我只能使用〜27500個卦。這意味着我只能使用最多10%的可用數據。
我能做些什麼來幫助解決這個問題?我有什麼選擇嗎?
我正在運行一個生成n-gram的文本機器學習算法。這當然會大量地擴大輸入的大小。把它放在上下文中,原始輸入是在一個文件中約30K行,在生成三元素之後,我有348000個條目。Python可以使用硬盤作爲額外的內存嗎?
我使用scikit
及其TfidfVectorizer
,如果給出的值太多,我會得到由numpy數組拋出的MemoryError
。在我達到極限之前,我只能使用〜27500個卦。這意味着我只能使用最多10%的可用數據。
我能做些什麼來幫助解決這個問題?我有什麼選擇嗎?
正如@jme所提到的,python對OS的內存管理沒有影響。 可能最合理的方法(如果找不到具有更多RAM的機器)將以某種方式限制功能的數量,例如,與TfidfVectorizer以下選項參數中的一個:
max_df:漂浮在範圍[0.0,1.0]或者int,默認= 1.0
在構建詞彙忽略具有文檔頻率嚴格條件高於給定的閾值(語料庫專用停用詞)。如果爲float,則該參數表示文檔的比例,即整數絕對計數。如果詞彙不是無,則忽略此參數。
min_df:在浮球範圍[0.0,1.0]或者int,默認= 1
在構建詞彙忽略具有文檔頻率大於給定閾值低嚴格條件。這個值在文獻中也被稱爲截斷值。如果爲float,則該參數表示文檔的比例,即整數絕對計數。如果詞彙不是無,則忽略此參數。
max_features:int或無,默認=無
如果不是無,建立一個詞彙表,只考慮通過在語料庫詞頻排序頂部max_features。
如果詞彙不是無,則忽略此參數。
我確實發現我的問題。事實證明,矢量化器非常高效,但如果你在矢量上調用toarray(),它會殺死內存。一旦我意識到,事情變得更好。 –
我相信這是一個真正的操作系統問題,因爲它是通過操作系統,可以分配一定量的磁盤空間作爲分頁或虛擬內存。但它會減慢速度*令人難以置信*。要麼找到一臺擁有更多內存的機器,要麼完全重新思考你的方法可能會更好。 – jme
查看[這個問題](http://stackoverflow.com/questions/5537618/memory-errors-and-list-limits-in-python)瞭解一些信息。確保你使用的是64位Python而不是32位。 – bbayles