Re: NegativeArraySizeException ... IndexOutOfBoundsException ...
~
Now, I wonder if you will go LOL (as I did) or cry about this. As a
straightforward way to index over Integer.MAX_VALUE I wishfully
thought of using a Memory-mapped file as some sort of (very expensive)
buffer, but well sun microsystems is at least consistent in their
nonsense
~
Using a Memory-mapped file and doing the bit crunching I will have my
cake and it is too (at least for all 10 primes less than 30) since
~
( 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 ) = 6469693230 <
17179869176
~
but I will be in for some voodoo and and hax to reach out passed that
number
~
Specially now that 64-bit machines are common, if any of you has a
say at sun could you please raise this issue with them? Yeah sure I
can switch to ANSI C/C++ and leave this whole nonsense behind but I
want to code/test implementations in all three c-fam languages
~
lbrtchx
~
$ java MemMappedIO00Test
/media/hdb2/tmp/test.dat
// __ Setting up Random Access Mapped Byte Buffer for 25769803760 bits
Exception in thread "main" java.lang.IllegalArgumentException: Size
exceeds Integer.MAX_VALUE
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:704)
at MemMappedIO00Test.main(MemMappedIO00Test.java:52)
~
/*
// clobbered from thinking_in_java/TIJ314_029.htm
*/
import java.io.*;
import java.util.*;
import java.text.*;
import java.nio.*;
import java.nio.channels.*;
// __
public class MemMappedIO00Test{
private static final String aNwLn = System.getProperty
("line.separator");
private static final String aEnc = "UTF-8";
// __
private static final void setOutErr(File ODir, String aPrfx, long
lTm00, boolean IsOut, boolean IsErr){
String aLogFl = aPrfx + "_" + (new SimpleDateFormat
("yyyyMMddHHmmss")).format(new Date(lTm00));
try{
if(IsOut){ PrintStream POS = new PrintStream((new FileOutputStream
(new File(ODir, aLogFl + ".out.txt"))), true, aEnc); System.setOut
(POS); }
if(IsErr){ PrintStream PES = new PrintStream((new FileOutputStream
(new File(ODir, aLogFl + ".err.txt"))), true, aEnc); System.setErr
(PES); }
}catch(FileNotFoundException FNFX){ FNFX.printStackTrace(); }
catch(IOException IOX){ IOX.printStackTrace(); }
}
// __
public static void main(String[] args) throws Exception{
// __
long lTm00 = System.currentTimeMillis();
String aKNm = "MemMappedIO00Test";
File ODir = new File(new File((new File(".").getAbsolutePath
())).getParent());
setOutErr(ODir, aKNm, lTm00, true, false);
// __
ODir = new File(".");
String aOFl = "_.dat";
File OFl = new File(ODir, aOFl);
System.err.println(OFl.getAbsolutePath());
long lL = (long)Integer.MAX_VALUE;
lL += (long)Integer.MAX_VALUE/2;
System.out.println("// __ Setting up Random Access Mapped Byte
Buffer for " + (8*lL) + " bits");
System.err.println("// __ Setting up Random Access Mapped Byte
Buffer for " + (8*lL) + " bits");
// __
MappedByteBuffer out = new RandomAccessFile(OFl, "rw").getChannel
().map(FileChannel.MapMode.READ_WRITE, 0, lL);
for(int i = 0; i < lL; ++i){ out.put((byte)255); }
// __
long lTm02 = System.currentTimeMillis();
System.out.println("// __ in " + (lTm02 - lTm00) + " (ms)");
System.err.println("// __ in " + (lTm02 - lTm00) + " (ms)");
// __
}
}