2014-02-18 67 views
0

簡單的問題:任何想法應該如何正確完成?我有3個包含大量信息的txt文件,我創建了一個類來負責從txt文件中讀取數據,並將數據作爲DTO組件列表(是的,信息可以捆綁爲這樣的邏輯單元) ,這取決於txt文件,之後客戶端將使用DAO並使用這樣的列表並將數據插入本地數據庫(sqlite)。我擔心的是,擁有這樣一個列表可能會對內存要求很高,我是否應該避免使用這樣的列表,並以某種方式直接使用dao對象插入此數據,而不將數據捆綁到dto中,最後是這樣的列表?如何正確地從txt文件插入數據到數據庫

+0

你的文件有多大?如果它們太大而不適合記憶,那麼你將不得不以大塊的方式處理它們。 –

+0

你有沒有想過?這聽起來像你正在試圖進行優化,甚至沒有采取「天真」的方法。有時候,天真就夠了。如果您已經嘗試過,並確定它在客戶端計算機上速度太慢或過於苛刻,請發佈一些代碼。 –

回答

0

你在問一個好問題,並自己部分回答。 是的,當然如果你真的有很多的信息,你不應該讀取文件的所有信息,然後將其存儲在數據庫中。您應該逐塊讀取信息塊,或者即使從應用程序的角度逐行讀取信息並將每行存儲爲數據塊。

在這種情況下,您將只需要一條記憶線。

您可以按如下方式設計應用程序。

  • 文件分析器返回Iterable<Row>
  • DB筆者,接受DB Iterable<Row>並存儲行,
  • 管理器同時呼籲。

在這種情況下,負責讀寫文件的邏輯將被封裝到某些模塊中,並且不需要額外的內存消耗。

+0

我想我將DAO用作我的「經理」,他們會「將行存儲在數據庫中」(在我的第一種方法中實際上是DTO),這與您的建議是一樣的嗎? –

+0

不,不是,我再讀一次,現在我明白了,對不起,我不能讓你高興,但非常感謝。 –

0

不會返回列表,但就像這個例子的迭代器:Iterating over the content of a text file line by line - is there a best practice? (vs. PMD's AssignmentInOperand)

必須修改這個迭代器返回的,而不是字符串的DTO:

for(MyDTO line : new BufferedReaderIterator(br)){ 
    // do some work 
} 

現在你會遍歷文件中的行按行,但您將返回DTO而不是返回行。這種解決方案對內存影響很小。

+0

我正在考慮這種方法,我會讓我的客戶端創建一個對象或使用某種方法來創建這樣一個循環,最終通過這種dto和我的dao的幫助插入數據。我認爲將使用你的答案和AlexR's的結合對不起我不能讓你高興。 –

+0

我沒有看到第一個答案 - 它必須是平行發佈的。至少兩個想法是相同的。 –