প্রতি ঘন্টা অর্ধ মিলিয়ন গণিত ক্রিয়াকলাপ করার সবচেয়ে কার্যকর উপায় [বন্ধ]


0

তাই ব্যক্তিগত এবং শেখার অভিজ্ঞতার কারণে আমি আবহাওয়ার ডেটা ডেটাবেস করা শুরু করেছি। আমি ডেটা পার্স করতে wgrib2 ব্যবহার করছি এবং মাইএসকিউএল আমদানি করছি। কারণ ডেটা বিভিন্ন ইউনিট - বায়ু "ইউ" এবং "ভি" উপাদানগুলি, ক্যালভিন ইত্যাদি ইত্যাদিতে ফর্ম্যাট করা আছে ... আমাকে এটিকে বায়ুর গতি নট, বায়ু ডিগ্রি ব্যাসার্ধ এবং তাপমাত্রা ডিগ্রি সি ... ইত্যাদিতে রূপান্তর করতে হবে etc.

আমি লুপের জন্য একটি বাশ তৈরি করেছি যা সমস্ত ডেটা মানগুলি লুপ করে, তবে এটি বরং অদক্ষ এবং আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে। এটি জঞ্জাল, প্রচুর ... উপর নির্ভর করে এবং প্রায় 1150 স্টেশনের জন্য ডেটা পার্স করতে 15-17 মিনিট সময় নেয়, প্রতিটি স্টেশনে মাইএসকিউএল ডাটাবেসে 160 টি কলাম সহ সমস্ত অভিন্ন কাঠামো রয়েছে table

আমি টি কে (টেম্প ক্যালভিন), আরএইচ (আর্দ্রতা) ইত্যাদির জন্য যে ব্যাশ অ্যারে সেট আপ করেছি ... এর মানগুলি 1000, 975, 950, 925 ... ইত্যাদির জন্য রয়েছে 100 মিলিবার পর্যন্ত।

for thKey in ${!TK[@]}
do
    thRH=${RH[$thKey]}
    thTK=${TK[$thKey]}
    thTC=$(echo -| awk -v tk="$thTK" '{printf "%.1f\n", tk-273.15}')
    thWU=${WU[$thKey]}
    thWV=${WV[$thKey]}
    thTD=$(echo -| awk -v tc="$thTC" -v rh="$thRH" '{printf "%.1f\n", tc-(100-rh)/5}')
    thWD=$(echo -| awk -v wu="$thWU" -v wv="$thWV" '{printf "%.0f\n", 57.29578*(atan2(wu, wv))+180}')
    thWS=$(echo -| awk -v wu="$thWU" -v wv="$thWV" '{printf "%.1f\n", sqrt(wu*wu+wv*wv)*1.944}')
    sed -i '/\/station_id/a <'"$thKey"'T>'"$thTC"'<\/'"$thKey"'T><'"$thKey"'D>'"$thTD"'<\/'"$thKey"'D><'"$thKey"'WD>'"$thWD"'<\/'"$thKey"'WD><'"$thKey"'WS>'"$thWS"'<\/'"$thKey"'WS>' $xmlOut
done

আপনি এটির দ্বারা দেখতে পাচ্ছেন যে স্পষ্ট সমস্যাটি হ'ল এটি প্রায় 1150 * 160 টি কল করতে জাগায় ... সুতরাং সম্ভবত মাস্টার অ্যারেগুলিকে বিশ্রামে পাঠানো হবে এবং লুপ প্রতি একবার মাত্র বিশ্রী জাগিয়ে তোলা হয়েছে (আমি এখন যা করছি তার 1/160 তম!) আরও দক্ষ হবে। তবে আমি এই অনুশীলনের জন্য অ্যাডাব্লিক সিনট্যাক্সটি সঠিকভাবে পেয়েছি বলে মনে হচ্ছে না ...

awk --version

জিএনইউ অ্যাওক 4.1.3, এপিআই: 1.1 (জিএনইউ এমপিএফআর 3.1.4, জিএনইউ এমপি 6.1.0)

এখানে একটি উদাহরণ:

TK=(325,350,231,655)
echo -| awk -v tk="${TK[*]}" '{split(tk,tka,/ /)} { for (i=0; i<=NF; i++) { printf "%.1f\n", tka[i]-273.15 } } '

-273.1 51.9

^ এটি সঠিক নয়। অ্যারের 4 টি মান রয়েছে, এটি কেবল 2 এ ফিরে আসবে না।

echo -| awk -v tk="${TK[*]}" '{split(tk,tka,/ /)} { for (i=0; i<=length(tka); i++) { printf "%.1f\n", tka[i]-273.15 } } '

^ এটি একটি অসীম লুপ তৈরি করে।

কোন ধারনা? কিছু পার্ল শিখতে পারেন এবং এই সমস্ত পার্ল স্ক্রিপ্টে পাস করেন?


এছাড়াও নিশ্চিত করুন যে dev xMLOut / dev / shm, টেম্পফ বা অন্য কোনও অবরুদ্ধকরণ আইও-তে রয়েছে। পার্ল আমি ব্যবহার করব কি হবে।
ব্যবহারকারী 1133275

যেহেতু আপনি একটি ডাটাবেসে ডেটা আমদানি করছেন, আপনি রূপান্তরগুলি সম্পাদন করতে ডাটাবেসটি ব্যবহার করতে পারেন ...
স্টিফেন কিট

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

উত্তর:


2

ব্যক্তিগতভাবে, হ্যাঁ আমি এগুলি পার্ল দিয়েই করতাম। :-)

TK=(325,350,231,655)

উফ। সতর্ক থেকো. আপনি উপাদান হিসাবে কমা-বিভাজিত স্ট্রিং সহ একটি একক উপাদান অ্যারে তৈরি করেছেন।

echo -| awk -v tk="${TK[*]}" '{split(tk,tka,/ /)} { for (i=0; i<=NF; i++) { printf "%.1f\n", tka[i]-273.15 } } '

awk অ্যারেগুলি শূন্য নয়, 1 এ শুরু হয়।

আপনি ভেরিয়েবলটি নির্ধারিত করার কারণে, আপনি সত্যিই এনএফ মান ব্যতীত অন্য কোনও কিছুর জন্য এসটিডিএন ডেটা ব্যবহার করছেন না (তবে আপনি কেবল একটি একক উপাদানেই পেরিয়ে গেছেন)। এনএফ ব্যবহার করার পরিবর্তে, আসুন কেবল splitস্পষ্টভাবে ফলাফল গণনা করুন । এরকম কিছু হতে পারে:

$ TK=(325 350 231 655)
$ echo - | awk -v tk="${TK[*]}" '{fields=split(tk,tka,/ /)} { for (i=1; i<=fields; i++) { printf "%.1f\n", tka[i]-273.15 } } '
51.9
76.9
-42.1
381.9

Dave_thompson_085 হিসাবে উল্লেখ করা হয়েছে, আপনি STDIN এর মাধ্যমে প্রেরণ না করে সরাসরি কোনও ভেরিয়েবলের কাছে ডেটা বরাদ্দ করে অতিরিক্ত কাজ করছেন। আরও সাধারণ কিছু হতে পারে সম্ভবত:

$ echo ${TK[*]} | awk '{for (i=1; i<=NF; i++) { printf "%.1f\n", $i-273.15 } } '
51.9
76.9
-42.1
381.9

এবং যদি আপনি কোনও perlসমাধানে একটি সূচনা চান :

$ echo ${TK[*]} | perl -lane 'for $item (@F) {print $item-273.15}'
51.85
76.85
-42.15
381.85

আপনি যা বলেছেন আমি তার ব্যতীত যা যা করেছি তাই আপনি বলেছিলেন: আপনি awk এর ডিফল্ট পার্সিং ব্যবহার করতে পারবেন: echo $TK | awk '{for(i=1;i<=NF;i++) printf "%.1f\n", $i-273.15}'বা কমা দিয়েTK=325,250,etc; echo $TK | awk -F, ...
dave_thompson_085

ধন্যবাদ! ।। ক্ষেত্র = (বিভক্ত ... কি আমি অনুপস্থিত ছিল এটি আমার 17 13 মিনিট থেকে কেটে গেছে আমিও stdin ব্যবহার করার জন্য একটি বিট আরো বন্ধ শেভ ধারণা বিবেচনা করব এবং গবেষণা পাইথন।।
user3260912
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.