বহুভুজ শেফিল দিয়ে একটি পয়েন্ট সিএসভিতে স্থানিকভাবে যোগ দেওয়ার দ্রুততম উপায়


19

আমার কাছে প্রায় 1 বিলিয়ন পয়েন্টের সিএসভি ফাইল এবং প্রায় 5,000 বহুভুজ সহ একটি শেফফিল রয়েছে। স্থানিকভাবে পয়েন্ট এবং বহুভুজগুলিতে যোগদানের দ্রুততম উপায় কী হবে? প্রতিটি পয়েন্টের জন্য, আমার সমন্বিত বহুভুজ আইডি নেওয়া দরকার। (বহুভুজগুলি ওভারল্যাপ করে না))

সাধারণত, আমি উভয় ডেটা সেট পোস্টজিআইএসে লোড করতাম। কাজটি সম্পন্ন করার আরও দ্রুত উপায় আছে?

আমি একটি মুক্ত উত্স সমাধান খুঁজছি।

উত্তর:


16

যদি "দ্রুততম" আপনার সময় ব্যয় করে তার পরিমাণ অন্তর্ভুক্ত করে তবে সমাধানটি নির্ভর করবে আপনি কোন সফ্টওয়্যার নিয়ে আরামদায়ক এবং দ্রুত ব্যবহার করতে পারবেন তার উপর। নিম্নলিখিত মন্তব্যগুলি ফলস্বরূপ দ্রুততম গণনার সময় অর্জনের জন্য ধারণাগুলিতে ফোকাস করে ।

আপনি যদি কোনও ক্যানড প্রোগ্রাম ব্যবহার করেন, তবে অবশ্যই কেডি ট্রি বা চতুষ্কোণের মতো একটি পয়েন্ট-ইন-বহুভুজ ডেটা কাঠামো স্থাপন করার জন্য বহুগুণগুলি প্রাক-প্রক্রিয়াজাতকরণ করা সবচেয়ে ভাল যা আপনি করতে পারেন whose লগ (ভি) ) * (এন + ভি)) যেখানে ভি বহুভুজের মোট শীর্ষোক্ত সংখ্যা এবং এন পয়েন্টের সংখ্যা, কারণ ডেটা স্ট্রাকচারটি তৈরি করতে কমপক্ষে ও (লগ (ভি) * ভি) প্রচেষ্টা গ্রহণ করবে এবং তারপরে হবে প্রতিটি পয়েন্টের জন্য প্রতি-পয়েন্ট ব্যয়ে হে (লগ (ভি)) এ অনুসন্ধান করতে হবে।

কোনও বহুচ্ছন্নতার ধারণা ধরে নিয়ে আপনি বহুভুজগুলি প্রথমে গ্রিড করে উল্লেখযোগ্যভাবে আরও ভাল করতে পারেন। প্রতিটি গ্রিড সেল পুরোপুরি বহুভুজ অভ্যন্তরে থাকে ("সার্বজনীন বহুভুজ" এর অভ্যন্তর অন্তর্ভুক্ত), সেক্ষেত্রে বহুভুজের আইডির সাথে সেলটি লেবেল করা হয়, না হলে এটিতে এক বা একাধিক বহুভুজ প্রান্ত থাকে। সমস্ত প্রান্তকে রাস্টারাইজ করার সময় গ্রিড কোষগুলির সংখ্যার সমান এই রাস্টেরাইজেশনের ব্যয় হ'ল ও (ভি / সি) যেখানে সি একটি ঘরের আকার, তবে বিগ-ও নোটেশনে অন্তর্নিহিত ধ্রুবকটি সামান্য।

(এই পদ্ধতির একটি সৌন্দর্য হ'ল আপনি স্ট্যান্ডার্ড গ্রাফিক্সের রুটিনগুলি কাজে লাগাতে পারেন example উদাহরণস্বরূপ, আপনার যদি এমন কোনও সিস্টেম থাকে যা (ক) প্রতিটি বহুভুজের জন্য একটি পৃথক রঙ ব্যবহার করে (খ) ভার্চুয়াল স্ক্রিনে বহুভুজ আঁকবে এবং (সি) অনুমতি দেয় আপনি যে কোনও পিক্সেলকে সম্বোধন করতে আগ্রহী তার রঙ পড়তে পারেন, আপনি এটি তৈরি করেছেন))

এই গ্রিডটি স্থানে রেখে প্রতিটি পয়েন্ট (একটি হে (1) ক্রিয়াকলাপে কেবল কয়েকটি ঘড়ি প্রয়োজন) সমন্বিত সেলকে গণনা করে পয়েন্টগুলি প্রাক-স্ক্রিন করুন। বহুভুজ সীমানার চারদিকে পয়েন্টগুলি ক্লাস্টার না করা হলে এটি সাধারণত অস্পষ্ট ফলাফল সহ কেবল ও (সি) পয়েন্টগুলিতে ছেড়ে যায়। গ্রিড এবং প্রাক-স্ক্রিনিং নির্মাণের মোট ব্যয় অতএব O (V / c + 1 / c ^ 2) + O (N)। ও (লগ (ভি) * এন * সি) এর ব্যয়ে আপনাকে বাকী পয়েন্টগুলি (যেগুলি বহুভুজের সীমানার কাছাকাছি রয়েছে) প্রক্রিয়াকরণের জন্য আপনাকে অন্য কিছু পদ্ধতি (যেমন এখন পর্যন্ত প্রস্তাবিতগুলির মধ্যে কোনওটি) ব্যবহার করতে হবে ।

সি ছোট হওয়ার সাথে সাথে কম এবং কম পয়েন্ট একই প্রান্তের সাথে একই গ্রিড কক্ষে থাকবে এবং তাই কম ও কম সংখ্যক পরবর্তী ও (লগ (ভি)) প্রসেসিংয়ের প্রয়োজন হবে। এর বিপরীতে অভিনয় করা হ'ল ও (1 / সি ^ 2) গ্রিড সেলগুলি সঞ্চয় করা এবং বহুভুজগুলিকে ছড়িয়ে দেওয়ার জন্য O (V / c + 1 / c ^ 2) সময় ব্যয় করা। সুতরাং একটি অনুকূল গ্রিড আকার সি হবে। এটা ব্যবহার করে, মোট গণনীয় খরচ হে (লগ (ভী) * এন) কিন্তু অন্তর্নিহিত ধ্রুবক সাধারণত হয় পথ , টিনজাত পদ্ধতি ব্যবহার প্রাক প্রদর্শণের হে (এন) গতির কারণে চেয়ে ছোট।

20 বছর আগে আমি এই পদ্ধতির পরীক্ষা করেছি (পুরো ইংল্যান্ড এবং উপকূল জুড়ে অভিন্ন দুরত্বের পয়েন্টগুলি ব্যবহার করে এবং সেই সময়ের ভিডিও বাফারদের দ্বারা প্রস্তাবিত প্রায় 400K কোষের তুলনামূলকভাবে অপরিশোধিত গ্রিডটি ব্যবহার করেছি) এবং আমি প্রকাশিত সেরা অ্যালগরিদমের তুলনায় 2 গিগাবাইট স্পিডআপের আদেশ পেয়েছি অনুসন্ধান. বহুভুজগুলি যখন ছোট এবং সাধারণ হয় (ত্রিভুজগুলির মতো) তখনও আপনি কার্যত গতির গতির একটি আদেশের পক্ষে কার্যত আশ্বস্ত হন।

আমার অভিজ্ঞতায় গণনাটি এত দ্রুত ছিল যে পুরো অপারেশনটি ডেটা I / O গতির দ্বারা সীমাবদ্ধ ছিল, সিপিইউ দ্বারা নয়। আই / ও সম্ভবত বাধা হতে পারে এমন প্রত্যাশা করে, আপনি ডাটা পঠনের সময়কে হ্রাস করার জন্য পয়েন্টগুলি যথাসম্ভব সংক্ষেপিত বিন্যাসে সংরক্ষণ করে খুব দ্রুত ফলাফল অর্জন করবেন। ফলাফলগুলি কীভাবে সংরক্ষণ করা উচিত সে সম্পর্কেও কিছু চিন্তাভাবনা করুন, যাতে আপনি ডিস্কের লেখাকে সীমাবদ্ধ করতে পারেন।


6
ভার্চুয়াল গণনার সময়টি সমাধান উপলব্ধি করে সময় দেওয়ার জন্য খুব ভাল পয়েন্ট। অনুকূল সমাধানে পৌঁছতে দীর্ঘ সময় নেওয়া কেবল তখনই উপকারী যদি আপনি সেই সঞ্চয়গুলি অপটিমাইজেশনের মাধ্যমে উপলব্ধ করেন (উদাহরণস্বরূপ কোনও নিয়োগকর্তার দৃষ্টিকোণ থেকে)।
সাসা আইভেটিক

5

আমার অংশ জন্য, আমি সম্ভবত একটি মধ্যে যে CSV ডেটা লোড হবে Shp ফাইল এবং তারপর ব্যবহার করে একটি পাইথন স্ক্রিপ্ট লিখতে shapefile এবং সুষম ধারণকারী বহুভুজ আইডি পেতে এবং ক্ষেত্রের মান আপডেট করার জন্য।

জিওটুলগুলি এবং জেটিএস শেফফাইল / সুদৃ !়ের চেয়ে দ্রুত কিনা তা আমি জানি না ... এটি পরীক্ষা করার সময় নেই!

সম্পাদনা করুন : যাইহোক, সিএসভি রূপান্তরিত আকারটি ফাইলে রূপান্তর করার সম্ভবত প্রয়োজন নেই, যেহেতু মানগুলি সহজেই আপনার বহুভুজ শেফফাইল থেকে স্থানিক বস্তুর সাথে পরীক্ষা করার জন্য ফর্ম্যাট করা যায়।


4
আমি সরাসরি সিএসভি রিডার ব্যবহার করে ডেটা লোড করব এবং একটি আর্ট্রি স্পেসিয়াল ইনডেক্সটি তৈরি করব । আর্ট্রি এবং শেপিলির সংমিশ্রণে একটি চিত্তাকর্ষক পারফরম্যান্স রয়েছে (পোস্টজিআইএসের চেয়ে অনেক ভাল; আমি জাভা জানি না বলে আমি জেটিএসের সাথে তুলনা করতে পারি না)।
মাইক টি

2
ভাল ধারণা প্রদান করা আপনার একসাথে সমস্ত 1 বি পয়েন্ট মেমরির মধ্যে সঞ্চয় করার দরকার নেই। প্রতি বিন্দুতে সর্বনিম্ন 16 বাইট (এক্স / ওয়াই), আপনি 16 গিগাবাইটের মূল্যবান ডেটা খুঁজছেন। যদি আর্ট্রি স্থানীয় স্টোরেজে সূচকটি তৈরি করে, তবে এটি অবশ্যই কর্মক্ষমতা উন্নত করবে। একক শেফফাইলে 1b পয়েন্ট আমদানি করাও কার্যকর হবে না। ওজিআর স্পেকস স্টেট শেফফাইলগুলি 8 জিবি (4 জিবি প্রস্তাবিত) এর মধ্যে সীমাবদ্ধ। একটি একক বিন্দু আকার 20 বাইট ব্যবহার করে।
সাসা আইভেটিক

4

আমি বহুভুজকে একটি রাস্টার হিসাবে রূপান্তরিত করেছি এবং বিন্দু অবস্থানে এটি নমুনা দিয়েছি। যেহেতু আমার বহুভুজগুলি ওভারল্যাপ হয়নি এবং উচ্চ নির্ভুলতা প্রয়োজনীয় ছিল না (বহুভুজগুলি ভূমি-ব্যবহারের শ্রেণিগুলি উপস্থাপন করে এবং তাদের সীমানাগুলি যেভাবেই হোক বরং অনিশ্চিত বলে বিবেচিত হয়েছিল) এটিই ছিল আমার সবচেয়ে কার্যকর সময় সমাধান।


3

আমি তাড়াতাড়ি উপর ভিত্তি করে একটি ছোট জাভা প্রোগ্রাম লিখতে হবে shapefile পাঠক এর geotools এবং অপারেশন রয়েছে এর JTS । আমি জানি না এটি কত দ্রুত হতে পারে ...


1
আপনার যদি পোস্টজিআইএসে ডেটা থাকে তবে জিওটুলগুলি গিস্ট ইনডেক্স ইত্যাদি ব্যবহার করতে পারে
আয়ান টার্টন

3

স্প্যাটালাইট ব্যবহার করুন

জিইউআই ডাউনলোড করুন। আপনি ভার্চুয়াল টেবিল হিসাবে শেফিল এবং সিএসভি উভয়ই খুলতে পারেন। এর অর্থ হ'ল আপনি এগুলি আসলে ডেটাবেজে আমদানি করেন না তবে সেগুলি টেবিল হিসাবে উপস্থিত হয় এবং আপনি দ্রুত যোগদান করতে এবং আপনার পছন্দের কোনও উপায়ে জিজ্ঞাসা করতে পারেন।


3

আপনি সি / সি ++ / পাইথনে ওজিআর ব্যবহার মোটামুটি দ্রুত করতে পারেন (পাইথনটি 3 এর চেয়ে ধীরতম হওয়া উচিত)। সমস্ত বহুভুজের মধ্য দিয়ে লুপ করুন এবং পয়েন্টগুলিতে একটি ফিল্টার সেট করুন, ফিল্টারকৃত পয়েন্টগুলির মধ্য দিয়ে লুপ করুন এবং আপনি জানতে পারবেন যে আপনি যে পয়েন্টগুলির মধ্য দিয়ে লুপ করেছেন তার প্রতিটি বর্তমান বহুভুজের অন্তর্ভুক্ত। ওজিআর ব্যবহার করে পাইথনের নমুনা কোডটি এখানে বহুভুজ এবং ফিল্টার পয়েন্টগুলি অনুসারে লুপ করবে। সি / সি ++ কোডটি এর সাথে বেশ মিল দেখায় এবং আমি কল্পনা করব যে আপনি অজগর বনাম একটি উল্লেখযোগ্য গতি বৃদ্ধি পাবেন। আপনার সাথে যেতে যেতে সিএসভি আপডেট করার জন্য আপনাকে কয়েকটি লাইন কোড যুক্ত করতে হবে:

from osgeo import ogr
from osgeo.gdalconst import *

inPolyDS = ogr.Open("winnipeg.shp", GA_ReadOnly)
inPolyLayer = inPolyDS.GetLayer(0)
inPointDS = ogr.Open("busstops.vrt", GA_ReadOnly)   
inPointLayer = inPointDS.GetLayerByName("busstops")

inPolyFeat = inPolyLayer.GetNextFeature()
while inPolyFeat is not None:
  inPtFeat = inPointLayer.GetNextFeature()
  while inPtFeat is not None:
    ptGeom = inPtFeat.GetGeometryRef()
    # Do work here...

    inPtFeat = inPointLayer.GetNextFeature()

  inPolyFeat = inPolyLayer.GetNextFeature()

ভিআরটি ফাইল (busstops.vrt):

<OGRVRTDataSource>
  <OGRVRTLayer name="busstops">
    <SrcDataSource>busstops.csv</SrcDataSource>
    <GeometryType>wkbPoint</GeometryType>
    <LayerSRS>WGS84</LayerSRS>
    <GeometryField encoding="PointFromColumns" x="X" y="Y" reportSrcColumn="FALSE" />
  </OGRVRTLayer>
</OGRVRTDataSource>

সিএসভি ফাইল (বাসস্টপস সিএসভি):

FID,X,Y,stop_name
1,-97.1394781371062,49.8712241633646,Southbound Osborne at Mulvey

সিএসভিটি ফাইল (busstops.csvt, OGR এর কলামের ধরণ সনাক্তকরণের প্রয়োজন এটি অন্যথায় এটি স্থানিক ফিল্টারটি সম্পাদন করবে না):

Integer,Real,Real,String

2
এই লুপটি 1 বিএন পয়েন্টের মাধ্যমে 5000 বার নয় (প্রতিটি বহুভুজের জন্য একবার)?
আন্ডার ডার্ক

একটি স্থানিক সূচক একটি পরম আবশ্যক । আমি এর আগে রটারির কথা উল্লেখ করেছি, আবারও উল্লেখ করব!
মাইক টি

-1

csv2shp csv2shp চেষ্টা করতে পারে

বিলিয়ন পয়েন্ট সিএসভি কোন শিল্পে রয়েছে তা জানতে আগ্রহী?


1
অনুরূপ প্রশ্ন মাইএসকিউএল পুনরায় 10 বিলিয়ন সারি Stackoverflow বোর্ডে জিজ্ঞাসা করা হল stackoverflow.com/questions/5735447/...
sirgeo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.