increase import speed
This commit is contained in:
@@ -7,6 +7,7 @@ public abstract class AbstractMarket implements Market {
|
|||||||
private final static Logger LOG = LoggerFactory.getLogger(AbstractMarket.class);
|
private final static Logger LOG = LoggerFactory.getLogger(AbstractMarket.class);
|
||||||
|
|
||||||
private boolean change;
|
private boolean change;
|
||||||
|
private boolean batch;
|
||||||
|
|
||||||
protected abstract Place createPlace(String name, double x, double y, double z);
|
protected abstract Place createPlace(String name, double x, double y, double z);
|
||||||
protected abstract Group createGroup(String name, GROUP_TYPE type);
|
protected abstract Group createGroup(String name, GROUP_TYPE type);
|
||||||
@@ -17,6 +18,25 @@ public abstract class AbstractMarket implements Market {
|
|||||||
protected abstract void removePlace(Place place);
|
protected abstract void removePlace(Place place);
|
||||||
protected abstract void addItem(Item item);
|
protected abstract void addItem(Item item);
|
||||||
protected abstract void removeItem(Item item);
|
protected abstract void removeItem(Item item);
|
||||||
|
protected void executeBatch(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startBatch() {
|
||||||
|
LOG.debug("Start batch");
|
||||||
|
batch = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void doBatch() {
|
||||||
|
LOG.debug("End batch, updated");
|
||||||
|
executeBatch();
|
||||||
|
batch = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBatch() {
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void add(Place place){
|
public final void add(Place place){
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
package ru.trader.core;
|
package ru.trader.core;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public interface Market {
|
public interface Market {
|
||||||
|
|
||||||
|
void startBatch();
|
||||||
|
void doBatch();
|
||||||
|
boolean isBatch();
|
||||||
|
|
||||||
void add(Place place);
|
void add(Place place);
|
||||||
Place addPlace(String name, double x, double y, double z);
|
Place addPlace(String name, double x, double y, double z);
|
||||||
void remove(Place place);
|
void remove(Place place);
|
||||||
@@ -109,6 +116,7 @@ public interface Market {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default void add(Market market){
|
default void add(Market market){
|
||||||
|
startBatch();
|
||||||
// add groups
|
// add groups
|
||||||
Collection<Group> groups = market.getGroups();
|
Collection<Group> groups = market.getGroups();
|
||||||
HashMap<Group, Group> mapGroups = new HashMap<>(groups.size(), 0.9f);
|
HashMap<Group, Group> mapGroups = new HashMap<>(groups.size(), 0.9f);
|
||||||
@@ -182,6 +190,7 @@ public interface Market {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
doBatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
default void clear(){
|
default void clear(){
|
||||||
@@ -210,6 +219,7 @@ public interface Market {
|
|||||||
|
|
||||||
|
|
||||||
default void clear(boolean offers, boolean vendors, boolean places, boolean items, boolean groups){
|
default void clear(boolean offers, boolean vendors, boolean places, boolean items, boolean groups){
|
||||||
|
startBatch();
|
||||||
if (places){
|
if (places){
|
||||||
Collection<Place> p = new ArrayList<>(get());
|
Collection<Place> p = new ArrayList<>(get());
|
||||||
for (Place place : p) {
|
for (Place place : p) {
|
||||||
@@ -238,6 +248,7 @@ public interface Market {
|
|||||||
remove(group);
|
remove(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
doBatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public class MarketDocHandler extends DefaultHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void startDocument() throws SAXException {
|
public void startDocument() throws SAXException {
|
||||||
world = new SimpleMarket();
|
world = new SimpleMarket();
|
||||||
|
world.startBatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -95,6 +96,7 @@ public class MarketDocHandler extends DefaultHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endDocument() throws SAXException {
|
public void endDocument() throws SAXException {
|
||||||
|
world.doBatch();
|
||||||
world.commit();
|
world.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,12 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.trader.core.*;
|
import ru.trader.core.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.DoubleSummaryStatistics;
|
||||||
|
import java.util.NavigableSet;
|
||||||
import java.util.concurrent.ConcurrentSkipListSet;
|
import java.util.concurrent.ConcurrentSkipListSet;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class SimpleItemStat extends AbstractItemStat {
|
public class SimpleItemStat extends AbstractItemStat {
|
||||||
private final static Logger LOG = LoggerFactory.getLogger(SimpleItemStat.class);
|
private final static Logger LOG = LoggerFactory.getLogger(SimpleItemStat.class);
|
||||||
@@ -36,6 +40,16 @@ public class SimpleItemStat extends AbstractItemStat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
synchronized void putAll(Collection<Offer> offers){
|
||||||
|
LOG.trace("Put offers to item stat {}", this);
|
||||||
|
if (this.offers.addAll(offers)){
|
||||||
|
DoubleSummaryStatistics stat = this.offers.stream().collect(Collectors.summarizingDouble(Offer::getPrice));
|
||||||
|
sum = stat.getSum();
|
||||||
|
avg = stat.getAverage();
|
||||||
|
LOG.trace("After this = {}", this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
synchronized void remove(Offer offer){
|
synchronized void remove(Offer offer){
|
||||||
LOG.trace("Remove offer {} from item stat {}", offer, this);
|
LOG.trace("Remove offer {} from item stat {}", offer, this);
|
||||||
assert offer.hasType(type) && offer.hasItem(item);
|
assert offer.hasType(type) && offer.hasItem(item);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import ru.trader.core.*;
|
import ru.trader.core.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class SimpleMarket extends AbstractMarket {
|
public class SimpleMarket extends AbstractMarket {
|
||||||
private final static Logger LOG = LoggerFactory.getLogger(SimpleMarket.class);
|
private final static Logger LOG = LoggerFactory.getLogger(SimpleMarket.class);
|
||||||
@@ -147,6 +148,7 @@ public class SimpleMarket extends AbstractMarket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onAdd(Vendor vendor) {
|
protected void onAdd(Vendor vendor) {
|
||||||
|
if (isBatch()) return;
|
||||||
LOG.trace("Cached on add vendor {}", vendor);
|
LOG.trace("Cached on add vendor {}", vendor);
|
||||||
Collection<Offer> offers = vendor.getAllSellOffers();
|
Collection<Offer> offers = vendor.getAllSellOffers();
|
||||||
for (Offer offer : offers) {
|
for (Offer offer : offers) {
|
||||||
@@ -160,6 +162,7 @@ public class SimpleMarket extends AbstractMarket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onRemove(Vendor vendor) {
|
protected void onRemove(Vendor vendor) {
|
||||||
|
if (isBatch()) return;
|
||||||
LOG.trace("Remove cache of vendor {}", vendor);
|
LOG.trace("Remove cache of vendor {}", vendor);
|
||||||
Collection<Offer> offers = vendor.getAllSellOffers();
|
Collection<Offer> offers = vendor.getAllSellOffers();
|
||||||
for (Offer offer : offers) {
|
for (Offer offer : offers) {
|
||||||
@@ -173,12 +176,14 @@ public class SimpleMarket extends AbstractMarket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onAdd(Offer offer) {
|
protected void onAdd(Offer offer) {
|
||||||
|
if (isBatch()) return;
|
||||||
LOG.trace("Cached on add offer {}", offer);
|
LOG.trace("Cached on add offer {}", offer);
|
||||||
put(getItemCache(offer.getType()), offer);
|
put(getItemCache(offer.getType()), offer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onRemove(Offer offer) {
|
protected void onRemove(Offer offer) {
|
||||||
|
if (isBatch()) return;
|
||||||
LOG.trace("Remove cache of offer {}", offer);
|
LOG.trace("Remove cache of offer {}", offer);
|
||||||
remove(getItemCache(offer.getType()), offer);
|
remove(getItemCache(offer.getType()), offer);
|
||||||
}
|
}
|
||||||
@@ -191,4 +196,48 @@ public class SimpleMarket extends AbstractMarket {
|
|||||||
systems.add(place);
|
systems.add(place);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startBatch() {
|
||||||
|
super.startBatch();
|
||||||
|
sellItems.clear();
|
||||||
|
buyItems.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void executeBatch() {
|
||||||
|
recreateCaches();
|
||||||
|
super.executeBatch();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void recreateCaches(){
|
||||||
|
Map<Item, Collection<Offer>> sellOffers = new HashMap<>();
|
||||||
|
Map<Item, Collection<Offer>> buyOffers = new HashMap<>();
|
||||||
|
|
||||||
|
systems.stream().flatMap(s -> s.get().stream())
|
||||||
|
.flatMap(v -> Stream.concat(v.getAllSellOffers().stream(), v.getAllBuyOffers().stream()))
|
||||||
|
.forEach(o -> {
|
||||||
|
Map<Item, Collection<Offer>> m = o.getType() == OFFER_TYPE.SELL ? sellOffers : buyOffers;
|
||||||
|
Collection<Offer> offers = m.get(o.getItem());
|
||||||
|
if (offers == null){
|
||||||
|
offers = new ArrayList<>(1000);
|
||||||
|
m.put(o.getItem(), offers);
|
||||||
|
}
|
||||||
|
offers.add(o);
|
||||||
|
});
|
||||||
|
for (Iterator<Map.Entry<Item, Collection<Offer>>> iterator = sellOffers.entrySet().iterator(); iterator.hasNext(); ) {
|
||||||
|
Map.Entry<Item, Collection<Offer>> entry = iterator.next();
|
||||||
|
SimpleItemStat stat = new SimpleItemStat(entry.getKey(), OFFER_TYPE.SELL);
|
||||||
|
stat.putAll(entry.getValue());
|
||||||
|
sellItems.put(stat.getItem(), stat);
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
for (Iterator<Map.Entry<Item, Collection<Offer>>> iterator = buyOffers.entrySet().iterator(); iterator.hasNext(); ) {
|
||||||
|
Map.Entry<Item, Collection<Offer>> entry = iterator.next();
|
||||||
|
SimpleItemStat stat = new SimpleItemStat(entry.getKey(), OFFER_TYPE.BUY);
|
||||||
|
stat.putAll(entry.getValue());
|
||||||
|
buyItems.put(stat.getItem(), stat);
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,22 +15,23 @@ public class Parser {
|
|||||||
private boolean canceled;
|
private boolean canceled;
|
||||||
|
|
||||||
public void parseSystems(File file, Market market) throws IOException {
|
public void parseSystems(File file, Market market) throws IOException {
|
||||||
parseFile(file, new SystemHandler(market), 1);
|
parseFile(file, new SystemHandler(market), 1, market);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parseStations(File file, Market market) throws IOException {
|
public void parseStations(File file, Market market) throws IOException {
|
||||||
parseFile(file, new StationHandler(market), 1);
|
parseFile(file, new StationHandler(market), 1, market);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parsePrices(File file, Market market) throws IOException {
|
public void parsePrices(File file, Market market) throws IOException {
|
||||||
parseFile(file, new OffersHandler(market, true), 0);
|
parseFile(file, new OffersHandler(market, true), 0, market);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseFile(File file, ParseHandler handler, int skip) throws IOException {
|
private void parseFile(File file, ParseHandler handler, int skip, Market market) throws IOException {
|
||||||
canceled = false;
|
canceled = false;
|
||||||
|
market.startBatch();
|
||||||
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
|
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
|
||||||
int row = 0;
|
int row = 0;
|
||||||
String line;
|
String line;
|
||||||
@@ -40,6 +41,8 @@ public class Parser {
|
|||||||
if (row <= skip) continue;
|
if (row <= skip) continue;
|
||||||
handler.parse(line);
|
handler.parse(line);
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
market.doBatch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user