2014-03-06 30 views
0

在某些過程中,我將對象存儲到文件(序列化)中。每批次將存儲100個文件。我很快就會收到「太多打開文件」的錯誤。寫入硬盤錯誤 - 打開文件過多

我在使用後立即關閉StreamWriter,並且我還嘗試處理該文件。我有一個多線程應用程序,但是我將存儲集中到一個線程中,以確保沒有多個X操作並行。我現在甚至按對象存儲對象(一次一個),我仍然得到這個錯誤。

它看起來像「關閉」或「處置」StreamWriter是不夠的。任何想法的人?

我嘗試了很多不同的代碼,但是這是我當前的代碼:

  Log.i("Streamwriter opened"); 
      StreamWriter outfile = new StreamWriter (filePath); 
      outfile.Write (content); 
      outfile.Close(); 
      outfile.Dispose(); 
      Log.i("Streamwriter closed"); 

我印這也是出於確保「開放」的文件時總是立刻跟着「關」的文件。

任何想法?

+0

我猜的GC不能跟上你創建的文件的數量。你可以嘗試切換到SGen,看看是否有幫助 - http://www.mono-project.com/Working_With_SGen – Jason

+2

我的猜測是,有其他打開的文件。您應該能夠使用樂器和其中一個文件相關模板來查看磁盤活動並查看哪些文件保持打開狀態。 –

+0

按照@Jason的建議切換GC將無濟於事 - 這就是爲什麼使用'IDisposable'是*正確*做的原因。其他的東西可能會使用太多的文件(比如@Rolf說的)。請參閱http://stackoverflow.com/q/15886034/220643和鏈接瞭解更多信息。 – poupou

回答

1

在發佈此問題之前,我已經嘗試過儀器和I/O模板,但在那裏找不到任何奇怪的東西。我現在試着從以下鏈接一些其他的方法:on iOS/iPhone: "Too many open files": need to list open files (like lsof)(該鏈接被張貼在由poupou在他的評論張貼計算器線程)

對我來說最好的方法是隻在終端類型在「lsof的」。我立即看到有很多我的數據庫很多打開的文件。 在序列化之前,我還將對象的ID寫入我的數據庫。因爲「太多打開的文件」錯誤總是指向我的序列化代碼(而不是我的數據庫代碼),所以我正在尋找一個問題。

將對象插入我的數據庫時,我使用「SqliteConnection」。我正確地關閉和處理這個對象,但是,似乎這還不足以真正關閉我的數據庫文件。

這個網址幫我一把:SQLite keeps the database locked even after the connection is closed

確實沒有處置的 「SqliteCommand」本身。

解決此問題後,我不再收到此錯誤。

謝謝!

SqliteConnection cnn = new SqliteConnection(dbConnection); 
    cnn.Open(); 
    SqliteCommand mycommand = new SqliteCommand(cnn); 
    mycommand.CommandText = sql; 
    object value = mycommand.ExecuteScalar(); 
    mycommand.Dispose();  // <= THIS FIXED THE ERROR 
    cnn.Close(); 
    cnn.Dispose(); 
+1

是的,這比StreamWriter更有意義。當你需要將對象放置在同一個作用域上時,使得它更易於閱讀(在我看來)。 – SKall

+0

非常感謝,我希望能夠修復我的應用程序中的奇怪錯誤,正如SKall所說,你應該總是使用圍繞一次性對象的使用塊:http://www.dotnetperls.com/using (我實際上不能在我的特殊情況下,因爲我在一個工作會話單元內收集SqliteCommands,所以我現在在提交會話後處理它們)。 –