簡體   English   中英

用於處理超出計算機內存容量的更多數據的設計模式?

[英]Design Patterns for processing more data than fits in computer's memory?

我想編寫一個可以處理大量數據的應用程序(例如,多年價格價格數據)。 數據可以來自文件服務器,Web等,但是想法是一次存儲在計算機內存中的數據太多了。 在處理數據時,我會將結果寫出(例如,寫入磁盤),然后可以丟棄數據。

我正在F#中工作,因此與.NET相關的反饋最有幫助。 我不必有具體的答案,只需對在這個問題區域中的良好閱讀指導即可。

  1. 是否有設計模式或工具包? 似乎與數據流編程類似,因為我只想一次處理部分可用數據,除了與數據流編程不同,我希望拉入數據,而不是等待數據到達然后作出反應。

  2. 我也想對這些數據進行並行處理。 我目前正在考慮的結構方式是: 每個線程都請求一些要使用的數據。 數據讀取器會提取盡可能多的請求數據,使其可以緩存在計算機內存中。 當線程完成此塊時,可以拉入另一個塊並進行緩存。 C。 數據讀取器還知道當前緩存了哪些塊,因此,如果多個線程請求相同的塊,則它們都可以從同一緩存中讀取(它們不必寫入)。 再次,是否為此存在.NET數據結構或設計模式?

  3. 最后,所有這些工作是否只是過度設計了車輪? 即,例如,最好只是嘗試將整個數據流吸入數組或哈希中,然后讓OS分頁擔心我上面描述的問題?

我想象SQL Server會處理這樣的問題,但是我想讀取的數據可能不在數據庫中,並且我不希望不引入對SQL Server的依賴性。 我也知道F#具有用於懶惰評估數據的序列,但是我不確定這是否適用於數據的隨機訪問-即我可能想從整個流中的任何位置獲取數據,只有從這一點上我才能順序訪問它。

通過使用.NET中的Stream類,似乎可以很好地回答主要問題。 流幾乎可以在任何東西(內存,文件,網絡等)上實現。因此,如果編寫代碼以從流中讀取並寫出到另一個流中,則可以更改讀取或寫入實現,而無需更改其余代碼。

就並行處理而言,我認為大文件中存在“記錄”概念。 如果是這種情況,並且由於您正在使用F#,則應該只能夠在流上創建一個迭代器,然后使用F#的並行性功能來處理每條記錄。

我將使用主/從設計模式,這是我認為您要使用的模式。2。不要讓OS分頁數據,您的速度將非常糟糕,並且您的應用程序將永遠無法完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM