{"id":7149,"date":"2013-01-17T16:00:32","date_gmt":"2013-01-17T14:00:32","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=7149"},"modified":"2013-01-17T06:34:31","modified_gmt":"2013-01-17T04:34:31","slug":"clojure-reading-and-writing-a-reasonably-sized-file","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html","title":{"rendered":"Clojure: Reading and writing a reasonably sized file"},"content":{"rendered":"<p>In a post a couple of days ago I <a href=\"http:\/\/www.markhneedham.com\/blog\/2013\/01\/08\/kaggle-digit-recognizer-finding-pixels-with-no-variance-using-r\/\">described some code I\u2019d written in R to find out all the features with zero variance<\/a> in the <a href=\"http:\/\/www.kaggle.com\/c\/digit-recognizer\">Kaggle Digit Recognizer<\/a> data set and yesterday I started working on some code to remove those features.<\/p>\n<p><a href=\"https:\/\/twitter.com\/jennifersmithco\">Jen<\/a> and I had previously written some code to parse the training data in Clojure so I thought I\u2019d try and adapt that to write out a new file without the unwanted pixels.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\nIn the first version we\u2019d encapsulated the reading of the file and parsing of it into a more useful data structure like so:<\/p>\n<pre class=\"brush:java\">(defn get-pixels [pix] (map #( Integer\/parseInt %) pix))\r\n\r\n(defn create-tuple [[ head &amp; rem]] {:pixels (get-pixels rem) :label head})\r\n\r\n(defn tuples [rows] (map create-tuple rows))\r\n\r\n(defn parse-row [row] (map #(clojure.string\/split % #\",\") row))\r\n\r\n(defn read-raw [path n] \r\n  (with-open [reader (clojure.java.io\/reader path)] (vec (take n (rest  (line-seq reader))))))\r\n\r\n(def read-train-set-raw  (partial read-raw \"data\/train.csv\"))\r\n\r\n(def parsed-rows (tuples (parse-row (read-train-set-raw 42000))))<\/pre>\n<p>So the def <cite>parsed-rows<\/cite> gives an in memory representation of a row where we\u2019ve separated the label and pixels into different key entries in a map. We wanted to remove any pixels which had a variance of 0 across the data set which in this case means that they always have a value of 0:<\/p>\n<pre class=\"brush:java\">(def dead-to-us-pixels\r\n  [0 1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20  21  22  23  24  25  26  27 28 29  30 31 52 53 54 55 56 57 82 83 84 85 111 112 139 140 141 168 196 392 420 421 448 476 532 560 644 645 671 672 673 699 700 701 727 728 729 730 731 754 755 756 757 758 759 760 780 781 782 783])\r\n\r\n(defn in? \r\n  \"true if seq contains elm\"\r\n  [seq elm]  \r\n  (some #(= elm %) seq))\r\n\r\n(defn dead-to-us? [pixel-with-index]\r\n  (in? dead-to-us-pixels (first pixel-with-index)))\r\n\r\n(defn remove-unwanted-pixels [row]\r\n  (let [new-pixels\r\n        (-&gt;&gt; row :pixels (map-indexed vector) (remove dead-to-us?) (map second))]\r\n    {:pixels new-pixels :label (:label row)}))\r\n\r\n(defn -main []\r\n  (with-open [wrt (clojure.java.io\/writer \"\/tmp\/attempt-1.txt\")]\r\n    (doseq [line parsed-rows]\r\n      (let [line-without-pixels (to-file-format (remove-unwanted-pixels line))]\r\n        (.write wrt (str line-without-pixels \"\\n\"))))))<\/pre>\n<p>We then ran the main method using \u2018leon run\u2019 which wrote out the new file. A print screen of the heap space usage while this function was running looks like this: <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><img decoding=\"async\" title=\"encapsulated-read-tiff.jpg\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/01\/encapsulated-read-tiff.jpg\" alt=\"Encapsulated read tiff\" width=\"406\" height=\"192\" border=\"0\" \/><\/p>\n<p>While I was writing this version of the function I made a mistake somewhere and ended up passing the wrong data structure to one of the functions which resulted in <a href=\"http:\/\/www.javamex.com\/tutorials\/memory\/string_memory_usage.shtml\">all the intermediate steps that the data structure goes through getting stored in memory<\/a> and caused an OutOfMemory exception.<\/p>\n<p>A heap dump showed the following:<\/p>\n<p><img decoding=\"async\" title=\"gone-wrong-tiff.jpg\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/01\/gone-wrong-tiff.jpg\" alt=\"Gone wrong tiff\" width=\"600\" height=\"96\" border=\"0\" \/><\/p>\n<p>When I reduced the size of the erroneous collection by using a \u2018take 10\u2032 I got an exception indicating that the function couldn\u2019t process the data structure which allowed me to sort it out.<\/p>\n<p>I initially thought that the problem was to do with the loading of the file into memory at all but since the above seems to work I don\u2019t think it is. When I was working along that theory Jen suggested it might make more sense to do the reading and writing of the files within a \u2018with-open\u2019 which tallies with <a href=\"http:\/\/stackoverflow.com\/questions\/10098402\/outofmemory-error-when-processing-a-big-file-in-clojure\">a suggestion I came across in a StackOverflow post<\/a>.<\/p>\n<p>I ended up with the following code:<\/p>\n<pre class=\"brush:java\">(defn split-on-comma [line]\r\n  (string\/split line #\",\"))\r\n\r\n(defn clean-train-file []\r\n  (with-open [rdr (clojure.java.io\/reader \"data\/train.csv\")\r\n              wrt (clojure.java.io\/writer \"\/tmp\/attempt-2.csv\")]\r\n    (doseq [line (drop 1 (line-seq rdr))]\r\n      (let [line-with-removed-pixels\r\n             ((comp to-file-format remove-unwanted-pixels create-tuple split-on-comma) line)]\r\n        (.write wrt (str line-with-removed-pixels \"\\n\"))))))<\/pre>\n<p>Which got called in the main method like this:<\/p>\n<pre class=\"brush:java\">(defn -main [] (clean-train-file))<\/pre>\n<p>This version had the following heap usage:<\/p>\n<p><img decoding=\"async\" title=\"all-in-with-open-tiff.jpg\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/01\/all-in-with-open-tiff.jpg\" alt=\"All in with open tiff\" width=\"403\" height=\"189\" border=\"0\" \/><\/p>\n<p>Its peaks are slightly lower than the first one and it seems like it buffers a bunch of lines, writes them out to the file (and therefore out of memory) and repeats.<br \/>\n&nbsp;<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.markhneedham.com\/blog\/2013\/01\/11\/clojure-reading-and-writing-a-reasonably-sized-file\/\">Clojure: Reading and writing a reasonably sized file <\/a>&nbsp;from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a>&nbsp;Markh Needham at the&nbsp;<a href=\"http:\/\/www.markhneedham.com\/blog\/\">Mark Needham Blog<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data set and yesterday I started working on some code to remove those features. Jen and I had previously written some code to parse the &hellip;<\/p>\n","protected":false},"author":134,"featured_media":93,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-7149","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clojure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Clojure: Reading and writing a reasonably sized file<\/title>\n<meta name=\"description\" content=\"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clojure: Reading and writing a reasonably sized file\" \/>\n<meta property=\"og:description\" content=\"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2013-01-17T14:00:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mark Needham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mark Needham\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html\"},\"author\":{\"name\":\"Mark Needham\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/fdb35381baa5059768d6788cfb685313\"},\"headline\":\"Clojure: Reading and writing a reasonably sized file\",\"datePublished\":\"2013-01-17T14:00:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html\"},\"wordCount\":440,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"articleSection\":[\"Clojure\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html\",\"name\":\"Clojure: Reading and writing a reasonably sized file\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"datePublished\":\"2013-01-17T14:00:32+00:00\",\"description\":\"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/01\\\/clojure-reading-and-writing-a-reasonably-sized-file.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Languages\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Clojure\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\\\/clojure\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Clojure: Reading and writing a reasonably sized file\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/fdb35381baa5059768d6788cfb685313\",\"name\":\"Mark Needham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g\",\"caption\":\"Mark Needham\"},\"sameAs\":[\"http:\\\/\\\/www.markhneedham.com\\\/blog\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Mark-Needham\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Clojure: Reading and writing a reasonably sized file","description":"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html","og_locale":"en_US","og_type":"article","og_title":"Clojure: Reading and writing a reasonably sized file","og_description":"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data","og_url":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2013-01-17T14:00:32+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","type":"image\/jpeg"}],"author":"Mark Needham","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Mark Needham","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html"},"author":{"name":"Mark Needham","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/fdb35381baa5059768d6788cfb685313"},"headline":"Clojure: Reading and writing a reasonably sized file","datePublished":"2013-01-17T14:00:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html"},"wordCount":440,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","articleSection":["Clojure"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html","url":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html","name":"Clojure: Reading and writing a reasonably sized file","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","datePublished":"2013-01-17T14:00:32+00:00","description":"In a post a couple of days ago I described some code I\u2019d written in R to find out all the features with zero variance in the Kaggle Digit Recognizer data","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2013\/01\/clojure-reading-and-writing-a-reasonably-sized-file.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JVM Languages","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages"},{"@type":"ListItem","position":3,"name":"Clojure","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages\/clojure"},{"@type":"ListItem","position":4,"name":"Clojure: Reading and writing a reasonably sized file"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/fdb35381baa5059768d6788cfb685313","name":"Mark Needham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5489baed26ce2d932bf951ecfb47afe80bec45d3648c23521d87c83b8f1c3ea9?s=96&d=mm&r=g","caption":"Mark Needham"},"sameAs":["http:\/\/www.markhneedham.com\/blog\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Mark-Needham"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/7149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/134"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=7149"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/7149\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/93"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=7149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=7149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=7149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}