Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GeoTools加载多线程几何图形_Java_Multithreading_Shapefile_Geotools_Jts - Fatal编程技术网

Java 使用GeoTools加载多线程几何图形

Java 使用GeoTools加载多线程几何图形,java,multithreading,shapefile,geotools,jts,Java,Multithreading,Shapefile,Geotools,Jts,嘿,我的社区, 我目前正在尝试编写一个小工具,它可以读取shapefile几何图形(多多边形/多边形),并将这些图形的WKT表示形式写入文本文件。 为此,我使用了GeoTools,并成功地使其运行良好,因为我正在转换具有大约5000000个多边形/多多边形的文件,这需要相当长的时间才能完成 所以我的问题是: 可以加快文件加载/写入速度吗? 因为我使用的是SimpleFeatureIterator,所以我没有找到如何实现多线程 有没有办法做到这一点? 或者有人知道,如何在不使用迭代器的情况下获得s

嘿,我的社区, 我目前正在尝试编写一个小工具,它可以读取shapefile几何图形(多多边形/多边形),并将这些图形的WKT表示形式写入文本文件。 为此,我使用了GeoTools,并成功地使其运行良好,因为我正在转换具有大约5000000个多边形/多多边形的文件,这需要相当长的时间才能完成

所以我的问题是:

可以加快文件加载/写入速度吗? 因为我使用的是SimpleFeatureIterator,所以我没有找到如何实现多线程

有没有办法做到这一点? 或者有人知道,如何在不使用迭代器的情况下获得shapefile几何体吗

这是我的代码:

此方法只是声明文件选择器并为每个选定文件启动线程

protected static void printGeometriesToFile() {
    JFileChooser chooser = new JFileChooser();
    FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "shape-files", "shp");
    chooser.setFileFilter(filter);
    chooser.setDialogTitle("Choose the file to be converted.");
    chooser.setMultiSelectionEnabled(true);
    File[] files = null;

    int returnVal = chooser.showOpenDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        files = chooser.getSelectedFiles();
    }

    for (int i = 0; i < files.length; i++) {
        MultiThreadWriter writer = new MultiThreadWriter(files[i]);
        writer.start();
    }
}
这只是一个辅助函数,它将多多边形转换为多边形,并以“|”作为分隔符返回其WKT表示

private byte[] geometryToByteArray(Polygonal polygonal) {

    List<Polygon> polygonList;

    String polygonString = "";

    if (polygonal instanceof MultiPolygon) {
        polygonList = GeometrieUtils.convertMultiPolygonToPolygonList((MultiPolygon) polygonal);
     //The method above just converts a MultiPolygon into a list of Polygons
    } else {
        polygonList = new ArrayList<>(1);
        polygonList.add((Polygon) polygonal);
    }

    for (int i = 0; i < polygonList.size(); i++) {
        polygonString = polygonString + polygonList.get(i).toString() + "|";
    }

    return polygonString.getBytes();
}
private byte[]geometrytoytobytearray(多边形){
多基因列表;
字符串polygonString=“”;
if(多多边形的多边形实例){
polygonList=GeometricUtils.convertMultiPolygonToPolygonList((MultiPolygon)Polygon);
//上面的方法只是将多多边形转换为多边形列表
}否则{
polygonList=新的ArrayList(1);
添加((多边形)多边形);
}
对于(int i=0;i
}

我知道我的代码不好看也不好。我刚刚开始学习Java,希望它能很快变得更好

诚恳


ihavenoclue:)

我更喜欢以对象列表的形式读取文件内容,然后将列表拆分为子列表,然后为每个列表创建一个线程,例如:

int nbrThreads = 10;

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(nbrThreads);

int count = myObjectsList != null ? myObjectsList.size() / nbrThreads : 0;

List<List<MyObject>> resultlists = choppeList(myObjectsList, count > 0 ? count : 1);

try
{
    for (List<MyObject> list : resultlists)
    {
        // TODO : create your thread and passe the list of objects   
    }

    executor.shutdown();

    executor.awaitTermination(30, TimeUnit.MINUTESS); // chose time of termination
}
catch (Exception e)
{
    LOG.error("Problem launching threads", e);
}
int=10;
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(NBR线程);
int count=myObjectsList!=无效的myObjectsList.size()/nbr线程:0;
列表结果列表=斩波列表(myObjectsList,计数>0?计数:1);
尝试
{
用于(列表:结果列表)
{
//TODO:创建线程并传递对象列表
}
executor.shutdown();
executor.awaitTermination(30,TimeUnit.MINUTESS);//选择终止时间
}
捕获(例外e)
{
LOG.error(“启动线程的问题”,e);
}
choppeList方法可以如下所示:

public <T> List<List<T>> choppeList(final List<T> list, final int L)
{
    final List<List<T>> parts = new ArrayList<List<T>>();
    final int N = list.size();
    for (int i = 0; i < N; i += L)
    {
        parts.add(new ArrayList<T>(list.subList(i, Math.min(N, i + L))));
    }
    return parts;
}
公共列表斩波列表(最终列表,最终整数L)
{
最终列表零件=新的ArrayList();
final int N=list.size();
对于(int i=0;i
  • 您不需要为每个文件创建新线程,因为创建新线程是一项昂贵的操作。相反,您可以让
    multi-threadwriter
    实现
    Runnable
    并使用
    ThreadPoolExecuter
    管理所有线程

    多线程编写器

    public class MultiThreadWriter implements Runnable {
        @Override
        public void run() {
            //
        }
    }
    
    创建与运行时处理器匹配的线程池

    ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    
    for (int i = 0; i < files.length; i++) {
        MultiThreadWriter writer = new MultiThreadWriter(files[i]);
        service.submit(writer);
    }
    

  • 真正的问题是,为什么要一个包含5000000个wkt多边形的文本文件?使用数据库可能是一个更好的主意。
    ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    
    for (int i = 0; i < files.length; i++) {
        MultiThreadWriter writer = new MultiThreadWriter(files[i]);
        service.submit(writer);
    }
    
    File outputFolder = new File(threadFile.getAbsolutePath() + ".txt");
    FileOutputStream fos = new FileOutputStream(outputFolder);
    BufferedWriter writer = new BufferedWriter(fos);