From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id XAA12232 for caml-redistribution; Sun, 24 Jan 1999 23:32:08 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id XAA11319 for ; Sun, 24 Jan 1999 23:31:45 +0100 (MET) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.8.7/8.8.7) with ESMTP id XAA11604; Sun, 24 Jan 1999 23:31:42 +0100 (MET) Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id XAA12515; Sun, 24 Jan 1999 23:31:42 +0100 (MET) From: Pierre Weis Message-Id: <199901242231.XAA12515@pauillac.inria.fr> Subject: Re: Size of arrays To: jjgarcia@ind-cr.uclm.es (Juan Jose Garcia Ripoll) Date: Sun, 24 Jan 1999 23:31:42 +0100 (MET) Cc: caml-list@inria.fr In-Reply-To: <36A9D5F0.F9215F45@ind-cr.uclm.es> from "Juan Jose Garcia Ripoll" at Jan 23, 99 03:00:16 pm X-Mailer: ELM [version 2.4 PL24 ME8] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: weis > I've noticed that OCaml imposes a very small upper limit in the size of > arrays: 8Mb or so, I think. Can this limit be modified somehow? [...] No there is no way to modify this limit: it is wired into the data structures representation algorithm. However, this limit is machine dependant, and very high on a 64bits machine (18014398509481983). Anyway, it is not difficult to design an ADT that gives you large arrays on a 32 bits machine: (* Module Bvect of big vectors (length up-to max_int). Access and assigment 2 times slowlier than regular arrays. Iteration is as efficient as Array.iter. *) (* bvect.mli *) type 'a bvect;; val make : int -> 'a -> 'a bvect;; val length : 'a bvect -> int;; val item : 'a bvect -> int -> 'a;; val assign : 'a bvect -> int -> 'a -> unit;; .... (* bvect.ml *) type 'a bvect = 'a array * 'a array;; let make len init = if len <= Sys.max_array_length then (Array.make len init, [| |]) else (Array.make Sys.max_array_length init, Array.make (len - Sys.max_array_length) init);; let length (v1, v2) = Array.length v1 + Array.length v2;; let item (v1, v2) i = if i < Sys.max_array_length then v1.(i) else v2.(i - Sys.max_array_length);; let assign (v1, v2) i item = if i < Sys.max_array_length then v1.(i) <- item else v2.(i - Sys.max_array_length) <- item;; let iter f (v1, v2) = Array.iter f v1; Array.iter f v2;; (* Omitted, sub_vect, map_vect, ..., as in module Array. *) Hope this helps, Pierre Weis INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/