[Jprogramming] Insert zeroes into large data file
Randy MacDonald
ramacd at nbnet.nb.ca
Wed Aug 6 04:36:59 HKT 2008
Hello Matthew;
Okay, one minute (60 seconds) will suffice then.
The conjunction idea is essentially correct. A 'filterFile' conjunction
could be written like so:
TargetFile ChunkSize filterFile FilterVerb SourceFile
This would be the modern form of a flat APL utility I recall developing,
back when 10MB and 512KB were the hard drive and RAM sizes
respectively. There will always be a bigger data source. I recall
manually adjusting the chunk size as time passed, benchmarking all the
way. FilterVerb was a direct definition string, a pre-dynamic function
if you will.
This tool was also be tweaked at some point to chunk on newline
boundaries. Generalizing to a 'big cut' looked feasible enough that it
never got implemented.
Matthew Brand wrote:
> it can be done in 43 seconds using C# for comparison:
>
> DateTime t = DateTime.Now;
>
> StreamReader sr = new StreamReader(@"C:\\input.csv");
>
> StreamWriter sw = new StreamWriter(@"C:\\output.csv");
>
> string s = "";
>
> string[] slt=null;
>
> string news="";
>
>
>
> while(!sr.EndOfStream)
>
> {
>
> s=sr.ReadLine();
>
> news = "";
>
> slt = s.Split(',');
>
> foreach(string p in slt)
>
> {
>
> if (p == "")
>
> news += "0";
>
> else
>
> news += p;
>
> news += ",";
>
> }
>
> news = news.Remove(news.Length-1);
>
> sw.WriteLine(news);
>
> }
>
> sw.Close();
>
> sr.Close();
>
> MessageBox.Show("Took " + DateTime.Now.Subtract(t).Seconds + "
> seconds");
>
> I think the main problem in J is running out of ram during the process. I
> tried the (#!.'0'~ 1 j. ',,' E. ]) solution on a 4Gb 64-bit XP machine and
> it was very slow, it started to use the page file in task manager - at that
> point I stopped the process. I think that given enough ram J would do it
> quickly with (#!.'0'~ 1 j. ',,' E. ]) ... but what about a 1Gb file, or a
> 10Gb file?
>
> I don't think that 138MB is considered very large these days. Intraday
> trading data or output of global climate models can easily be larger than
> this.
>
> I was wondering whether it is possible to write an adverb that auto
> splits whatever is coming in to it on the basis of availible memory or to
> make some kind of chunkifiaction happen automatically... but don't think it
> would be easy to do. One might input a set of asserts to guide the splitting
> process and use info about the ram size to determine wether it is neccesary
> and how many splits to do.
>
> The chunkify method takes 86 seconds, which is good enough for me at the
> moment...
>
> require'jmf' NB. map file utilities loaded in jmf
> require'files dir'
> textfile =. 'C:\input.csv'
> JCHAR map_jmf_ 'bigtext';textfile
> chunk_idx =. (i.@:<.&.(%&chunk_size <i.@:%3C.&.(%25&chunk_size> =:
> 10000))@:#
> chunkify_mask =. (($@:[ $ 0"_) (1"_)`]`[} _1 , ] + ',,' -:"1 ({~ (,.
>
>> :))) chunk_idx
>>
> null2zero =. #!.'0'~ 1 j.',,' E. ]
> ts=: 6!:2, 7!:2@]
> ts ' ((;@:(<@:null2zero;.2)~ chunkify_mask) bigtext ) 1!:2
> <''C:\output.csv'' '
> 85.6266 5.38447e8
>
> It would be nice if this chunkification just happened somehow in the
> background though and all you needed to write is:
>
> require'jmf' NB. map file utilities loaded in jmf
> require'files dir'
> textfile =. 'C:\input.csv'
> JCHAR map_jmf_ 'bigtext';textfile
>
> ( #!.'0'~ 1 j.',,' E. ]) MEMHANDLE (assert1`assert2`...) bigtext
>
> Where MEMHANDLE is a conjunction which manages the splitting and assert1,...
> are a list of things that have to hold true in each split.
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
>
--
------------------------------------------------------------------------
|\/| Randy A MacDonald | APL: If you can say it, it's done.. (ram)
|/\| ramacd <at> nbnet.nb.ca |
|\ | | The only real problem with APL is that
BSc(Math) UNBF'83 | it is "still ahead of its time."
Sapere Aude | - Morten Kromberg
Natural Born APL'er |
-----------------------------------------------------(INTP)----{ gnat }-
More information about the Programming
mailing list