Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/DiskBench.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/fun/DiskBench.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,569 @@ +package fun; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; +import java.util.Random; + +import fileIO.ByteFile; +import fileIO.ByteStreamWriter; +import fileIO.FileFormat; +import fileIO.QuickFile; +import fileIO.ReadWrite; +import fileIO.TextFile; +import shared.Parse; +import shared.Parser; +import shared.PreParser; +import shared.Shared; +import shared.Timer; +import shared.Tools; +import stream.FastaReadInputStream; +import structures.ByteBuilder; + +/** + * @author Brian Bushnell + * @date December 6, 2017 + * + */ +public class DiskBench { + + public static void main(String[] args){ + //Start a timer immediately upon code entrance. + Timer t=new Timer(); + + //Create an instance of this class + DiskBench x=new DiskBench(args); + + //Run the object + x.process(t); + + //Close the print stream if it was redirected + Shared.closeStream(x.outstream); + } + + public DiskBench(String[] args){ + + {//Preparse block for help, config files, and outstream + PreParser pp=new PreParser(args, getClass(), false); + args=pp.args; + outstream=pp.outstream; + } + + ReadWrite.USE_PIGZ=ReadWrite.USE_UNPIGZ=true; + ReadWrite.MAX_ZIP_THREADS=Shared.threads(); + + Parser parser=new Parser(); + parser.overwrite=true; + for(int i=0; i<args.length; i++){ + String arg=args[i]; + String[] split=arg.split("="); + String a=split[0].toLowerCase(); + String b=split.length>1 ? split[1] : null; + + if(a.equals("path")){ + path=b; + if(path==null){path="";} + else if(!path.endsWith("/")){path=path+"/";} + }else if(a.equals("lines")){ + maxLines=Long.parseLong(b); + if(maxLines<0){maxLines=Long.MAX_VALUE;} + }else if(a.equals("data") || a.equals("size")){ + data=Parse.parseKMG(b); + }else if(a.equals("passes")){ + passes=Integer.parseInt(b); + }else if(a.equals("verbose")){ + verbose=Parse.parseBoolean(b); + }else if(a.equals("gzip")){ + verbose=Parse.parseBoolean(b); + }else if(a.equals("mode")){ + assert(b!=null) : "Bad parameter: "+arg; + if(Tools.isDigit(b.charAt(0))){mode=Integer.parseInt(b);} + else if("read".equalsIgnoreCase(b) || "r".equalsIgnoreCase(b)){mode=READ;} + else if("write".equalsIgnoreCase(b) || "w".equalsIgnoreCase(b)){mode=WRITE;} + else if("readwrite".equalsIgnoreCase(b) || "rw".equalsIgnoreCase(b)){mode=READWRITE;} + else{assert(false) : "Bad mode: "+arg;} + }else if(a.equals("read") || a.equals("r")){ + mode=READ; + }else if(a.equals("write") || a.equals("w")){ + mode=WRITE; + }else if(a.equals("readwrite") || a.equals("rw")){ + mode=READWRITE; + }else if(a.equals("printtid")){ + printTid=Parse.parseBoolean(b); + }else if(a.equals("processbis")){ + processBis=Parse.parseBoolean(b); + }else if(a.equals("preread")){ + preRead=Parse.parseBoolean(b); + } + + else if(a.equals("method")){ + assert(b!=null) : "Bad parameter: "+arg; + if(Tools.isDigit(b.charAt(0))){method=Integer.parseInt(b);} + else if("BYTEFILE".equalsIgnoreCase(b) || "bf".equalsIgnoreCase(b)){method=BYTEFILE;} + else if("TEXTFILE".equalsIgnoreCase(b) || "tf".equalsIgnoreCase(b)){method=TEXTFILE;} + else if("QUICKFILE".equalsIgnoreCase(b) || "qf".equalsIgnoreCase(b)){method=QUICKFILE;} + else if("BUFFEREDINPUTSTREAM".equalsIgnoreCase(b) || "bis".equalsIgnoreCase(b)){method=BUFFEREDINPUTSTREAM;} + else if("FILEINPUTSTREAM".equalsIgnoreCase(b) || "fis".equalsIgnoreCase(b)){method=FILEINPUTSTREAM;} + else if("BUFFEREDINPUTSTREAM2".equalsIgnoreCase(b) || "bis2".equalsIgnoreCase(b)){method=BUFFEREDINPUTSTREAM2;} + else if("FILEINPUTSTREAM2".equalsIgnoreCase(b) || "fis2".equalsIgnoreCase(b)){method=FILEINPUTSTREAM2;} + else{assert(false) : "Bad mode: "+arg;} + } + else if("BYTEFILE".equalsIgnoreCase(a) || "bf".equalsIgnoreCase(a)){method=BYTEFILE;} + else if("TEXTFILE".equalsIgnoreCase(a) || "tf".equalsIgnoreCase(a)){method=TEXTFILE;} + else if("QUICKFILE".equalsIgnoreCase(a) || "qf".equalsIgnoreCase(a)){method=QUICKFILE;} + else if("BUFFEREDINPUTSTREAM".equalsIgnoreCase(a) || "bis".equalsIgnoreCase(a)){method=BUFFEREDINPUTSTREAM;} + else if("FILEINPUTSTREAM".equalsIgnoreCase(a) || "fis".equalsIgnoreCase(a)){method=FILEINPUTSTREAM;} + else if("BUFFEREDINPUTSTREAM2".equalsIgnoreCase(a) || "bis2".equalsIgnoreCase(a)){method=BUFFEREDINPUTSTREAM2;} + else if("FILEINPUTSTREAM2".equalsIgnoreCase(a) || "fis2".equalsIgnoreCase(a)){method=FILEINPUTSTREAM2;} + else if("buffer".equalsIgnoreCase(a) || "bufferlen".equalsIgnoreCase(a)){ + bufferlen=(int)Parse.parseKMGBinary(b); + } + + else if(parser.parse(arg, a, b)){ + //do nothing + }else{ + outstream.println("Unknown parameter "+args[i]); + assert(false) : "Unknown parameter "+args[i]; + // throw new RuntimeException("Unknown parameter "+args[i]); + } + } + + {//Process parser fields + overwrite=parser.overwrite; + threads=Shared.threads(); + } + + assert(FastaReadInputStream.settingsOK()); + + if(!ByteFile.FORCE_MODE_BF2){ + ByteFile.FORCE_MODE_BF2=false; + ByteFile.FORCE_MODE_BF1=true; + } + + File pfile=new File(path); + if(!pfile.exists()){pfile.mkdirs();} + } + + class WriteThread extends Thread{ + + public WriteThread(String fname_, long size_){ + fname=fname_; + size=size_; + } + + @Override + public void run(){ + t=new Timer(); + written=writeRandomData(fname, size, t, overwrite); + } + + String fname; + long size; + long written=0; + Timer t; + + } + + public static long writeRandomData(final String fname, final long size, final Timer t, final boolean overwrite){ + if(t!=null){t.start();} + long written=0; + final Random randy=Shared.threadLocalRandom(); + FileFormat ffout=FileFormat.testOutput(fname, FileFormat.TEXT, null, true, overwrite, false, false); + ByteStreamWriter bsw=new ByteStreamWriter(ffout); + bsw.start(); + final ByteBuilder bb=new ByteBuilder(66000); + final int shift=6; + final int shiftsPerRand=32/shift; + assert(shiftsPerRand>0); + final long limit=size-20-shiftsPerRand*1000; + while(written<limit){ + for(int i=0; i<1000; i+=shiftsPerRand){ + int x=randy.nextInt(); + for(int j=0; j<shiftsPerRand; j++){ + byte b=(byte)(33+x&63); + bb.append(b); + x>>=shift; + } + } +// for(int i=0; i<1000; i+=shiftsPerRand){ +// long x=randy.nextLong(); +// for(int j=0; j<shiftsPerRand; j++){ +// byte b=(byte)(33+x&63); +// bb.append(b); +// x>>=shift; +// } +// } + bb.nl(); + written+=bb.length; + bsw.print(bb); + bb.clear(); + } + while(written<size-1){ + bb.append((byte)(33+(randy.nextInt()&63))); + written++; + } + bb.nl(); + written+=bb.length; + bsw.print(bb); + bb.clear(); + bsw.poisonAndWait(); + File f=new File(fname); + long diskSize=(f.length()); + if(t!=null){t.stop();} + return diskSize; + } + + class ReadThread extends Thread{ + + public ReadThread(String fname_, int tid_){ + fname=fname_; + tid=tid_; + } + + @Override + public void run(){ + t=new Timer(); + FileFormat ffin=FileFormat.testInput(fname, FileFormat.TEXT, null, false, false, false); + + if(method==BYTEFILE){ + runBf(ffin); + }else if(method==QUICKFILE){ + runQf(ffin); + }else if(method==TEXTFILE){ + runTf(ffin); + }else if(method==BUFFEREDINPUTSTREAM){ + runBis(ffin, true); + }else if(method==FILEINPUTSTREAM){ + runBis(ffin, false); + }else if(method==BUFFEREDINPUTSTREAM2){ + runBis2(ffin, true); + }else if(method==FILEINPUTSTREAM2){ + runBis2(ffin, false); + } + if(printTid){System.err.print(tid+",");} + t.stop(); + } + + private void runBf(FileFormat ffin){ + ByteFile bf=ByteFile.makeByteFile(ffin); + for(byte[] line=bf.nextLine(); line!=null; line=bf.nextLine()){ + read+=line.length+1; + } + } + + private void runQf(FileFormat ffin){ + QuickFile qf=new QuickFile(ffin); + for(byte[] line=qf.nextLine(); line!=null; line=qf.nextLine()){ + read+=line.length+1; + } + } + + private void runTf(FileFormat ffin){ + TextFile tf=new TextFile(ffin); + for(String line=tf.nextLine(); line!=null; line=tf.nextLine()){ + read+=line.length()+1; + } + } + + private void runBis(FileFormat ffin, boolean bufferedStream){ + + final byte[] buffer=new byte[bufferlen]; + InputStream is=ReadWrite.getInputStream(ffin.name(), bufferedStream, false); + + for(int r=1; r>0; ){ + r=0; + try { + r=is.read(buffer); + if(r>0){read+=r;} + + if(processBis){ + int last=0; + for(int i=1; i<r; i++){ + byte b=buffer[i]; + if(b=='\n'){ + cache=Arrays.copyOfRange(buffer, last, i); + last=i+1; + } + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + try { + is.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void runBis2(FileFormat ffin, boolean bufferedStream){ + + final byte[] buffer=new byte[bufferlen]; + InputStream is=ReadWrite.getInputStream(ffin.name(), bufferedStream, false); + + list=new ArrayList<byte[]>(800); + for(int r=1; r>0; ){ + r=0; + try { + r=is.read(buffer); + if(r>0){read+=r;} + + if(processBis){ + int last=0; + for(int i=1; i<r; i++){ + byte b=buffer[i]; + if(b=='\n'){ + byte[] line=Arrays.copyOfRange(buffer, last, i); + list.add(line); + if(list.size()>=800){ + list=new ArrayList<byte[]>(800); + } + last=i+1; + } + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + try { + is.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + byte[] cache; + ArrayList<byte[]> list; + String fname; + long read=0; + long lines=0; + Timer t; + final int tid; + + } + + String[] makeFnames(int pass){ + String[] fnames=new String[threads]; + Random randy=new Random(); + for(int i=0; i<threads; i++){ + fnames[i]=path+pass+"_"+i+"_"+(System.nanoTime()&0xFFFF)+"_"+randy.nextInt(4096); + } + return fnames; + } + + Timer readWrite(String[] fnamesW, String[] fnamesR){ + Timer t=new Timer(); + + WriteThread[] wta=new WriteThread[threads]; + long size=data/threads; + for(int i=0; i<threads; i++){ + wta[i]=new WriteThread(fnamesW[i], size); + } + for(int i=0; i<threads; i++){ + wta[i].start(); + } + + ReadThread[] rta=new ReadThread[threads]; + for(int i=0; i<threads; i++){ + rta[i]=new ReadThread(fnamesR[i], i); + } + for(int i=0; i<threads; i++){ + rta[i].start(); + } + + for(int i=0; i<threads; i++){ + while(wta[i].getState()!=Thread.State.TERMINATED){ + try { + wta[i].join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + for(int i=0; i<threads; i++){ + while(rta[i].getState()!=Thread.State.TERMINATED){ + try { + rta[i].join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + t.stop(); + return t; + } + + Timer write(String[] fnames){ + Timer t=new Timer(); + WriteThread[] wta=new WriteThread[threads]; + long size=data/threads; + for(int i=0; i<threads; i++){ + wta[i]=new WriteThread(fnames[i], size); + } + for(int i=0; i<threads; i++){ + wta[i].start(); + } + for(int i=0; i<threads; i++){ + while(wta[i].getState()!=Thread.State.TERMINATED){ + try { + wta[i].join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + t.stop(); + return t; + } + + Timer read(String[] fnames){ + + Timer t=new Timer(); + + if(preRead){ + ReadThread rt=new ReadThread(fnames[0], 0); + rt.start(); + while(rt.getState()!=Thread.State.TERMINATED){ + try { + rt.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + ReadThread[] rta=new ReadThread[threads]; + for(int i=0; i<threads; i++){ + rta[i]=new ReadThread(fnames[i], i); + } + for(int i=0; i<threads; i++){ + rta[i].start(); + } + for(int i=0; i<threads; i++){ + while(rta[i].getState()!=Thread.State.TERMINATED){ + try { + rta[i].join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + linesInternal+=(rta[i].list==null ? 0 : rta[i].list.size()); + } + t.stop(); + return t; + } + + void delete(String[] fnames){ + for(String s : fnames){ + File f=new File(s); + if(f.exists()){ + f.delete(); + } + } + } + + void process(Timer t0){ + + t0.start(); + String[] fnamesW=makeFnames(0); + + Timer t=write(fnamesW); + String[] fnamesR=fnamesW; + fnamesW=null; + + final long initialWriteElapsed=t.elapsed; + + System.err.println("Initial write: \t"+t.toString()+" \t"+String.format(Locale.ROOT, "%.3f MB/s", (1000.0*data)/t.elapsed)); + + for(int pass=0; pass<passes; pass++){ + if(mode==READWRITE){ + fnamesW=makeFnames(pass); + t=readWrite(fnamesW, fnamesR); + delete(fnamesR); + fnamesR=fnamesW; + fnamesW=null; + }else if(mode==READ){ + t=read(fnamesR); + }else{ + delete(fnamesR); + fnamesW=makeFnames(pass); + t=write(fnamesW); + fnamesR=fnamesW; + fnamesW=null; + } + System.err.println("Pass "+pass+": \t"+t.toString()+" \t"+String.format(Locale.ROOT, "%.3f MB/s", (1000.0*data)/t.elapsed)); + } + delete(fnamesR); + + t0.stop(); + System.err.println("Overall: \t"+t0.toString()+" \t"+String.format(Locale.ROOT, "%.3f MB/s", (1000.0*(data*passes))/(t0.elapsed-initialWriteElapsed))); + + if(errorState){ + throw new RuntimeException(getClass().getName()+" terminated in an error state; the output may be corrupt."); + } + } + + /*--------------------------------------------------------------*/ + + + /*--------------------------------------------------------------*/ + + private String path=""; + + /*--------------------------------------------------------------*/ + + private int bufferlen=4096; + private long data=8000000000L; + private int passes=2; + + public int linesInternal; + + private int threads; + + private long maxLines=Long.MAX_VALUE; + + int mode=READWRITE; + static final int READWRITE=1, READ=2, WRITE=3; + + boolean printTid=false; + boolean processBis=false; + boolean preRead=false; + + int method=BYTEFILE; + static final int BYTEFILE=1; + static final int TEXTFILE=2; + static final int BUFFEREDINPUTSTREAM=3; + static final int FILEINPUTSTREAM=4; + static final int BUFFEREDINPUTSTREAM2=5; + static final int FILEINPUTSTREAM2=6; + static final int QUICKFILE=7; + + /*--------------------------------------------------------------*/ + + /*--------------------------------------------------------------*/ + + private PrintStream outstream=System.err; + public static boolean verbose=false; + public boolean errorState=false; + private boolean overwrite=true; + +}