2016-03-01 50 views
3

有沒有辦法建立一個有很多領域的defrecord?看起來有大約122個字段的限制,因爲這給出了「方法代碼太大!」錯誤:大的defrecord導致「方法代碼太大」

(defrecord WideCsvFile 
    [a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 
    a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39 
    a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56 a57 a58 a59 
    a60 a61 a62 a63 a64 a65 a66 a67 a68 a69 a70 a71 a72 a73 a74 a75 a76 a77 a78 a79 
    a80 a81 a82 a83 a84 a85 a86 a87 a88 a89 a90 a91 a92 a93 a94 a95 a96 a97 a98 a99 
    a100 a101 a102 a103 a104 a105 a106 a107 a108 a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 a119 
    a120 a121 a122]) 

雖然刪除任何字段允許創建記錄。

+0

爲什麼你需要這樣做? –

+0

我正在處理一堆不同的csv文件。我不希望我的代碼通過將行放入向量中而散佈索引號。由於其中一些文件有數百萬行,因此我不想通過將它們放入常規地圖來招致額外的垃圾收集成本,所以defrecord似乎是最佳解決方案。這是所有的文件,直到我最後一個,這恰好是126個字段寬。由於我的文件閱讀代碼是相當共享的,想要查看是否有方法在搜索不同的方法之前創建更大的記錄... –

+1

您可以使用'deftype'來代替嗎? –

回答

2

Java對於其方法具有最大大小(有關詳細信息,請參閱this question的答案)。 defrecord創建的方法的大小取決於記錄將包含的值的數量。

爲了解決這個問題,我看到兩個選項:

  1. macroexpand-1您的來電defrecord,複製結果,並找到一種方法來重新寫生成的方法要小一些。
  2. 採用不同的方法來存儲您的數據,例如使用Clojure的vector類。

編輯:

現在,我知道你想要做什麼,我更加堅信,你應該使用的載體。既然你要使用像a101指標,我寫你一個宏來生成它們:

(defmacro auto-index-vector [v prefix] 
    (let [indices (range (count (eval v))) 
     definitions (map (fn [ind] 
          `(def ~(symbol (str prefix ind)) ~ind)) indices)] 
    `(do [email protected]))) 

讓我們嘗試一下!

stack-prj.bigrecord> (def v1 (into [] (range 122))) 
#'stack-prj.bigrecord/v1 
stack-prj.bigrecord> (auto-index-vector v1 "a") 
#'stack-prj.bigrecord/a121 
stack-prj.bigrecord> (v1 a101) 
101 
stack-prj.bigrecord> (assoc v1 a101 "hi!") 
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 
95 96 97 98 99 100 "hi!" 102 103 104 105 106 107 108 109 110 111 112 
113 114 115 116 117 118 119 120 121] 

要使用此:你會讀到您的CSV數據爲載體,在其上調用auto-index-vector與您選擇的前綴,並使用所產生的指數來對數據進行向量運算。

+0

已經看到了64kb的代碼限制,並且在提出問題之前已經在兩場的defrecord上做了宏觀展開,並且被它的大小震驚了。我希望其他人也遇到過這種情況,並發現了另一種定義不會發生代碼爆炸的記錄的方法! –

+1

我應該提到實際的字段名有含義,例如upc或unspsc。接受你的回答,並感謝你和@Elogent的想法。 –

相關問題