package com.revolsys.record.io.test;
import java.nio.file.Path;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.GregorianCalendar;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.geometry.model.impl.PointDoubleXY;
import com.revolsys.io.IoFactory;
import com.revolsys.io.file.Paths;
import com.revolsys.record.ArrayRecord;
import com.revolsys.record.Record;
import com.revolsys.record.io.RecordWriter;
import com.revolsys.record.io.RecordWriterFactory;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.record.schema.RecordDefinitionBuilder;
import com.revolsys.spring.resource.PathResource;
import com.revolsys.spring.resource.Resource;
/*
Comma-Separated Values 0:5.749 150000105
GeoJSON 0:10.890 332000043
Geography Markup Language 0:10.104 474000136
GPS Exchange Format 0:3.90 67000147
XHMTL 0:7.864 257000499
JSON 0:7.464 274000014
KMZ - Google Earth 0:14.74 4194226
KML - Google Earth 0:10.580 865000128
ESRI Shapefile 0:9.408 36000100
ESRI Shapefile inside a ZIP archive 0:11.662 7191631
Tab-Separated Values 0:3.238 151000105
Well-Known Text Geometry 0:0.196 11000000
D-Base 0:11.887 606000418
Excel Workbook 0:34.742 10511807
XML 0:9.136 373000065
*/
public class RecordWriterPerformanceTest {
public static void main(final String[] args) {
final Path basePath = Paths.getPath("target/test/performance/recordWriter");
Paths.createDirectories(basePath);
final RecordDefinition recordDefinition = newRecordDefinition(DataTypes.POINT);
// writeRecords(basePath, recordDefinition, new Json());
for (final RecordWriterFactory writerFactory : IoFactory.factories(RecordWriterFactory.class)) {
writeRecords(basePath, recordDefinition, writerFactory);
}
// writeRecords(basePath, recordDefinition, new Kml());
}
private static Record newRecord(final RecordDefinition recordDefinition, final int index) {
final Record record = new ArrayRecord(recordDefinition);
record.setValue("boolean", index % 2 == 0);
record.setValue("byte", index % 256 + Byte.MIN_VALUE);
record.setValue("short", index % 65536 + Short.MIN_VALUE);
record.setValue("int", index);
record.setValue("long", index);
record.setValue("float", index + index % 1000 / 1000.0);
record.setValue("double", index + index % 1000 / 1000.0);
record.setValue("string", "String with some special characters " + index + "\\/\"'\t\n\r");
final Calendar calendar = new GregorianCalendar();
calendar.set(2016, 11, index % 28 + 1, 0, 0);
final Date date = new Date(calendar.getTimeInMillis());
record.setValue("date", date);
calendar.set(Calendar.MINUTE, index % 60);
final java.util.Date dateTime = new java.util.Date(calendar.getTimeInMillis());
record.setValue("dateTime", dateTime);
calendar.set(Calendar.MILLISECOND, index % 1000);
final Timestamp timestamp = new Timestamp(calendar.getTimeInMillis());
record.setValue("timestamp", timestamp);
record.setValue("geometry", new PointDoubleXY(index, index * 2));
return record;
}
private static RecordDefinition newRecordDefinition(final DataType geometryType) {
return new RecordDefinitionBuilder("PerformanceTest") //
.addField("boolean", DataTypes.BOOLEAN) //
.addField("byte", DataTypes.BYTE) //
.addField("short", DataTypes.SHORT) //
.addField("int", DataTypes.INT) //
.addField("long", DataTypes.LONG) //
.addField("float", DataTypes.FLOAT) //
.addField("double", DataTypes.DOUBLE) //
.addField("string", DataTypes.STRING) //
.addField("date", DataTypes.SQL_DATE) //
.addField("dateTime", DataTypes.DATE) //
.addField("timestamp", DataTypes.TIMESTAMP) //
.addField("geometry", geometryType) //
.getRecordDefinition();
}
private static void writeRecords(final Path basePath, final RecordDefinition recordDefinition,
final RecordWriterFactory writerFactory) {
final String fileExtension = writerFactory.getFileExtensions().get(0);
final Resource resource = new PathResource(basePath.resolve("records." + fileExtension));
final Record record = newRecord(recordDefinition, 0);
// Prime the code to avoid initialization in timings
try {
writeRecords(writerFactory, recordDefinition, resource, 1, record);
} finally {
resource.delete();
}
try {
final long time = System.currentTimeMillis();
final int numIterations = 1000000;
writeRecords(writerFactory, recordDefinition, resource, numIterations, record);
final long ellapsedTime = System.currentTimeMillis() - time;
final long millis = ellapsedTime % 1000;
final long seconds = ellapsedTime / 1000 % 60;
final long minutes = ellapsedTime / 60000 % 60;
System.out.println(writerFactory.getName() + "\t" + minutes + ":" + seconds + "." + millis
+ "\t" + resource.getFile().length());
} finally {
resource.delete();
}
for (int i = 0; i < 10; i++) {
System.gc();
synchronized (record) {
try {
record.wait(1000);
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static void writeRecords(final RecordWriterFactory writerFactory,
final RecordDefinition recordDefinition, final Resource resource, final int numIterations,
final Record record) {
try (
RecordWriter writer = writerFactory.newRecordWriter(recordDefinition, resource)) {
writer.open();
for (int i = 0; i < numIterations; i++) {
writer.write(record);
}
}
}
}