嘿,StackOverflow社区,我目前正在尝试编写一个小工具,它可以读取shapefiles几何图形(多多边形/多边形),并将这些图形的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();
}
}
用于多线程的类:
class MultiThreadWriter extends Thread {
private File threadFile;
MultiThreadWriter(File file) {
threadFile = file;
System.out.println("Starting Thread for " + file.getName());
}
public void run() {
try {
File outputFolder = new File(threadFile.getAbsolutePath() + ".txt");
FileOutputStream fos = new FileOutputStream(outputFolder);
System.out.println("Now writing data to file: " + outputFolder.getName());
FileDataStore store = FileDataStoreFinder.getDataStore(threadFile);
SimpleFeatureSource featureSource = store.getFeatureSource();
SimpleFeatureCollection featureCollection = featureSource.getFeatures();
SimpleFeatureIterator featureIterator = featureCollection.features();
int pos = 0;
while (featureIterator.hasNext()) {
fos.write((geometryToByteArray((Polygonal) featureIterator.next().getAttribute("the_geom"))));
pos++;
System.out.println("The file " + threadFile.getName() + "'s current positon is: " + pos);
}
fos.close();
System.out.println("Finished writing.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这只是一个辅助函数,它将多多边形转换为多边形,并返回其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();
}
}
我知道我的代码不漂亮或不好。我刚刚开始学习Java,希望它能很快变得更好。
真诚地
我的线索:)
我更喜欢以对象列表的形式读取文件内容,然后将列表拆分为子列表,然后为每个列表创建一个线程,例如:
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);
}
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;
}
>
您不需要为每个文件创建一个新线程,因为创建新线程是一个昂贵的操作。相反,您可以让MultiThreadWriter
实现Runnable
并使用ThreadPoolExectter
管理所有线程。
多线程编写器
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);
}
您可以使用BufferedWriter
代替OutputStream
,当您重复编写小片段时效率更高。
File outputFolder = new File(threadFile.getAbsolutePath() + ".txt");
FileOutputStream fos = new FileOutputStream(outputFolder);
BufferedWriter writer = new BufferedWriter(fos);
问题内容: 我们正在尝试将 图像预加载 到缓存中,以便稍后加载(图像位于应用程序的 Asset文件夹 中) 我们尝试了什么: 问题:仅当我们尝试加载/显示图像时才对它们进行缓存:必须先将它们加载到内存中,这样它们才能更快地显示出来。 我们还尝试使用GlideModule来增加CacheMemory的大小: 在清单中: 到目前为止没有任何工作。任何想法? 我们尝试使用不可见的1 dp imageVi
本文向大家介绍Java Swing 多线程加载图片(保证顺序一致),包括了Java Swing 多线程加载图片(保证顺序一致)的使用技巧和注意事项,需要的朋友参考一下 大二的时候做的课程设计,图片管理器,当时遇到图片很多的文件夹,加载顺序非常慢。虽然尝试用多个Thread加载图片,却无法保证图片按顺序加载。直到今天学会了使用Callable接口和Future接口,于是心血来潮实现了这个功能。 废话
本文向大家介绍Tensorflow 多线程与多进程数据加载实例,包括了Tensorflow 多线程与多进程数据加载实例的使用技巧和注意事项,需要的朋友参考一下 在项目中遇到需要处理超级大量的数据集,无法载入内存的问题就不用说了,单线程分批读取和处理(虽然这个处理也只是特别简单的首尾相连的操作)也会使瓶颈出现在CPU性能上,所以研究了一下多线程和多进程的数据读取和预处理,都是通过调用dataset
问题内容: 我正在尝试使用线程下载多个与模式匹配的文件。该模式可以匹配1或5或10个差异大小的文件。 为了简单起见,可以说下载文件的实际代码在downloadFile()方法中,而fileNames是与模式匹配的文件名列表。我该如何使用线程。每个线程将仅下载一个文件。建议在for循环内创建一个新线程。 问题答案: 您确实想使用ExecutorService而不是单个线程,它更干净,性能可能更高,并
我是flutter的新手,上周才开始。我正在从在线课程中学习,然后我想在我的flutter应用程序中加载一个图像。但有一个错误是:
下面是关于如何绘制多色线的示例,我可以根据一些彩色地图绘制沿其长度改变颜色的线。为了给剧情添加一个传说,我添加了以下代码: 这会将图例添加到绘图中(下图),但图例中图标的颜色与线条的颜色完全不相关。这是向该绘图添加图例的错误方法,还是matplotlib的限制?