我有 93 個陣列。每個陣列平均有大約 18 個值,我需要制作這些陣列的乘積。
所以我有我的二維陣列來存盤這 93 個陣列。
這是我嘗試做的
DATASET.first.product(*DATASET[1..-1])
紅寶石歸來
RangeError: too big to product
有誰知道一些解決方法來解決它?將它們分塊的一些方法?
uj5u.com熱心網友回復:
你想要的是不可能的。
93個陣列與每個?18個元素的產物是具有約549975033204266172374216967425209467080301768557741749051999338598022831065169332830885722071173603516904554174087168元素,其中的每一個是一個93個元素的陣列的陣列。
這意味著你需要549975033204266172374216967425209467080301768557741749051999338598022831065169332830885722071173603516904554174087168 * 93 *的64位記憶體來存放它,這大概是409181424703974032246417423764355843507744515806959861294687507916928986312485983626178977220953161016576988305520852992位元組。這比宇宙中的粒子數量多出大約 40 個數量級。換句話說,即使你將整個宇宙轉換成 RAM,你仍然需要找到一種方法來在宇宙中的每個粒子上存盤 827180612553027 yobibyte的數量級;大約是萬維網資訊內容的 600000000000000000000000 倍和暗網資訊內容的 10000000000000000000000 倍。
有誰知道一些解決方法來解決它?將它們分塊的一些方法?
即使你在塊處理它們,不會改變的事實,你仍然需要程序51147678087996754030802177970544480438468064475869982661835938489616123289060747953272372152619145127072123538190106624個元素。即使您能夠為每條 CPU 指令處理一個元素(這是不現實的,您可能需要數十甚至數百條指令),即使每條指令只需要一個時鐘周期(這是不現實的,在當前主流 CPU 上,每個指令需要多個時鐘周期),即使你有一個太赫茲 CPU(這是不現實的,目前最快的 CPU 最高可達 5 GHz),即使你的 CPU 有一百萬個內核(這是不現實的,即使 GPU 也只有一個幾千個極其簡單核心),即使你的主板有100萬個插槽(這是不現實的,主流主板最多只有4個插槽,即使最大的超級計算機也只有1000萬個核心),即使你有100萬個一個集群中的計算機,即使你在一個超級集群中有一百萬個這樣的集群,即使你有一百萬個朋友也有這樣的超級集群,它仍然需要你大約 1621000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
uj5u.com熱心網友回復:
是的,所以希望很明顯不應該嘗試這樣做,我會冒險并嘗試解決您的實際問題。
你在評論中提到你需要這個陣列來進行屬性測驗 - 我會在這里大放異彩并假設你想測驗每個可能的組合都滿足某些條件 - 這是這里的錯誤,因為數量可能的組合只是……大……
相反,您可以測驗某些組合是否有效。您可以使用以下方法輕松生成簡短的隨機組合串列:
Array.new(num) { DATASET.map(&:sample) }
num您要測驗的多個組合在哪里。請注意,某些條目可能會被復制 - 但考慮到您的資料集大小,該機會與碰撞 uuid 相當,可以安全地忽略。
生成這樣一個可能解決方案的子集更容易、更快,最重要的是,它是可能的。由于輸出是隨機的,它會在每次運行時測驗略有不同的組合,因此如果您希望能夠重新創建失敗,請記住在您的測驗套件中進行一些隨機設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/338273.html
