Clojure 从edn文件读取映射时出现重复密钥异常

Clojure 从edn文件读取映射时出现重复密钥异常,clojure,Clojure,我正在使用将Clojure映射持久化到文件 (spit (str tmpdir "/" "results.edn") (.toString c)) 其中c是一个非常大的哈希映射(文件为201MB)。映射的键是字符串,值是数字 当我试图从文件中读回映射时,我得到了一个重复的密钥异常。下面是我如何尝试重新阅读的 (def phrases (edn/read (PushbackReader. (io/reader

我正在使用将Clojure映射持久化到文件

(spit (str tmpdir "/" "results.edn") (.toString c))
其中
c
是一个非常大的哈希映射(文件为201MB)。映射的键是字符串,值是数字

当我试图从文件中读回映射时,我得到了一个重复的密钥异常。下面是我如何尝试重新阅读的

(def phrases (edn/read 
                (PushbackReader. 
                  (io/reader
                    "/tmp/mednotes8910030368496690883/results.edn"))))
当映射被写入edn文件时,它如何以重复键结束?有什么想法吗

以下是例外的内容:

Caused by java.lang.IllegalArgumentException
   Duplicate key: ? 5

    PersistentHashMap.java:   67  clojure.lang.PersistentHashMap/createWithCheck
                   RT.java: 1538  clojure.lang.RT/map
            EdnReader.java:  631  clojure.lang.EdnReader$MapReader/invoke
            EdnReader.java:  142  clojure.lang.EdnReader/read
            EdnReader.java:  108  clojure.lang.EdnReader/read
                   edn.clj:   35  clojure.edn/read
                   edn.clj:   33  clojure.edn/read
                  AFn.java:  154  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
根据要求,以下是地图中的示例:

{"cervical region of" 32,
 "partial brachial" 64,
 "is an effective medication for" 32,
 ", as stopping them" 32,
 ", supportive treatment" 160,
 "should be eating a normal" 128,
 "o call back if supplement" 32,
 "diagnosiscod diabc }" 32,
 "days in case of allergies" 32,
 "ointment 8 drops" 32,
 "leg from pinched" 32,
...
@fl00r在注释中建议grep results.edn文件中的字符串“?5”。使用egrep显示该字符串前后的20个字符,我得到了该键的4个条目:

[/tmp/mednotes8910030368496690883]> egrep -o ".{20}\"\? 5\" .{20}" results.edn 
oothbrush for" 160, "? 5" 32, ". ) during his 
t with sutures" 32, "? 5" 352, "4.81 pounds" 1
"being up all" 32, "? 5" 32, "limited financi
everytime she" 32, "? 5" 32, "had a partial m

有趣的是,4个中有3个具有完全相同的计数。仍然不确定当从一个看起来不错的没有这些重复的映射中写入时,会发生什么情况。

您的一些输入(c的内容)会有很大帮助。您应该使用
(pr str)
打印对象,以确保读卡器可以读取它。@Andre我想。toString是对pr str的调用,有人知道吗?一般来说,最好使用pr*函数,尽管我找不到一个例子。在地图上搜索返回的内容不等于pr str返回的内容。他的数据已损坏(上次运行时部分写入的结果)或者我的假设不正确?因此,现在您遇到了一个全新的问题:)