Well, you could use resizeable arrays instead of lists for each bucket.
Thank you all for the assistance.
I've resolved the Stack_overflow problem by using an Array instead of
a Hashtbl; my keys were just consecutive integers, so this later
approach is clearly preferable.
However, the memory usage is still pretty bad...it takes nearly an
order of magnitude more memory than the equivalent C++ program. While
the C++ program required 800 MB, my ocaml program requires roughly 6
GB. Am I doing something very inefficiently? My revised code appears
below.
Also, if you have any other coding suggestions I'd appreciate hearing
them. I'm a long-time coder but new to Ocaml and eager to learn.
--------------
exception SplitError
let loadWholeFile filename =
let infile = open_in filename
and movieMajor = Array.make 17770 [] in
let rec loadLines count =
let line = input_line infile inlet murList = Pcre.split line inand mInt = int_of_string m
match murList with
| m::u::r::[] ->
let rFloat = float_of_string r
and uInt = int_of_string u in
let newElement = (uInt, rFloat)
and oldList = movieMajor.(mInt) in
let newList = List.rev_append [newElement] oldList in
Array.set movieMajor mInt newList;
if (count mod 1000000) == 0 then begin
Printf.printf "count: %d\n" count;
flush stdout;
end;End_of_file -> close_in infile;
loadLines (count + 1)
| _ -> raise SplitError
in
try
loadLines 0
with
movieMajor;;let str = loadWholeFile filename;;
let filename = Sys.argv.(1);;
_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs