সুতরাং আমি একটি ডেটা ফাইল পেয়েছি (সেমিকোলন বিচ্ছিন্ন) যাতে অনেকগুলি বিশদ এবং অসম্পূর্ণ সারি রয়েছে (অ্যাক্সেস এবং এসকিউএলকে দম বন্ধ করে দেওয়া)। এটি 40 বছর ধরে বিভাগ, উপ-বিভাগ এবং উপ-উপ-বিভাগগুলিতে (মোট ~ 200 ফ্যাক্টরের জন্য) বিভক্ত কাউন্টি স্তরের ডেটা সেট করেছে। সংক্ষেপে, এটি বিশাল, এবং আমি কেবল এটি পড়ার চেষ্টা করলে এটি মেমরির সাথে খাপ খায় না।
সুতরাং আমার প্রশ্নটি হ'ল যে আমি সমস্ত কাউন্টি চাই, তবে কেবলমাত্র একটি এক বছর (এবং কেবলমাত্র উচ্চ স্তরের স্তরটি ... প্রায় 100,000 সারি নিয়ে যাচ্ছে) শেষ পর্যন্ত কী পাওয়ার সবচেয়ে ভাল উপায় হবে? এই রোলআপ আর?
বর্তমানে আমি পাইথনের সাথে অপ্রাসঙ্গিক বছরগুলি কেটে ফেলার চেষ্টা করছি, একবারে এক লাইনে পড়ে এবং অপারেটিং করে ফাইলসাইজ সীমাটি ঘুরে দেখি তবে আমি একটি আর-সলিউশন (ক্র্যান প্যাকেজস ঠিক আছে) পছন্দ করি। আর-তে কোনও সময় ফাইলগুলিতে কোনও টুকরো পড়ার মতো উপায় আছে কি?
কোন ধারনা ব্যাপকভাবে প্রশংসা হবে।
হালনাগাদ:
- সীমাবদ্ধতা
- আমার মেশিনটি ব্যবহার করার দরকার , তাই ইসি 2 উদাহরণ নেই
- যতটা সম্ভব আর-র R গতি এবং সংস্থানগুলি এই ক্ষেত্রে উদ্বেগ নয় ... তবে শর্ত আছে যে আমার মেশিনটি বিস্ফোরিত না হয় ...
- আপনি নীচে দেখতে পাচ্ছেন যে ডেটাতে মিশ্র প্রকার রয়েছে, যা আমাকে পরে চালানো দরকার
- ডেটা
- ডেটা 3.5 জিবি, প্রায় 8.5 মিলিয়ন সারি এবং 17 কলাম সহ
- কয়েক হাজার সারি (k 2 কে) 17 টির পরিবর্তে কেবল একটি কলাম সহ বিকৃত
- এগুলি সম্পূর্ণ গুরুত্বহীন এবং বাদ দেওয়া যায়
- এই ফাইলটি থেকে আমার কেবলমাত্র 100,000 ডলার সারি প্রয়োজন (নীচে দেখুন)
ডেটা উদাহরণ:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
আমি কয়েকটি কলাম কাটতে চাইছি এবং 40 টি উপলভ্য বছরের মধ্যে দুটি (1980-2020 থেকে ২০০৯-২০১ pick) বাছাই করতে চাই, যাতে তথ্যটি আর-তে ফিট করতে পারে:
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
ফলাফল:
সমস্ত পরামর্শ দেওয়া নিয়ে পরামর্শ দেওয়ার পরে, আমি সিদ্ধান্ত নিয়েছি যে জেডি এবং মারেকের প্রস্তাবিত রিডলাইনগুলি সবচেয়ে ভাল কাজ করবে। আমি মারেককে চেক দিয়েছি কারণ তিনি একটি নমুনা বাস্তবায়ন করেছেন।
আমি এখানে আমার চূড়ান্ত উত্তরের জন্য মারেকের প্রয়োগের কিছুটা অভিযোজিত সংস্করণ পুনরুত্পাদন করেছি, স্টারস্প্লিট এবং বিড়াল ব্যবহার করে কেবলমাত্র কলামগুলিই রাখতে চাই।
এছাড়া উল্লেখ করা উচিত এই হল অনেক কম পাইথন তুলনায় দক্ষ ... হিসেবে, পাইথন 5 মিনিটের মধ্যে 3.5GB ফাইল মাধ্যমে chomps আর 60 লাগবে যখন ... কিন্তু যদি সব আপনার আছে আর হয় তাহলে এই টিকেট।
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
পদ্ধতির দ্বারা ব্যর্থতা:
- sqldf
- ভবিষ্যতে এই ধরণের সমস্যার জন্য অবশ্যই এটি ব্যবহার করব যদি ডেটাটি সুবিন্যস্ত হয়। যাইহোক, যদি এটি না হয় তবে এসকিউএলাইট চিট করে।
- মানচিত্র কমাতে
- সত্যি কথা বলতে কি, ডকসটি আমাকে এটিকে খানিকটা ভয় দেখিয়েছিল, তাই আমি চেষ্টা করে দেখার চেষ্টা করিনি। দেখে মনে হচ্ছিল এটির জন্যও বস্তুটির স্মৃতিশক্তি থাকা দরকার, যা যদি এমন হয় তবে পয়েন্টটি পরাস্ত করবে।
- বিগমেমরি
- এই পদ্ধতিটি পরিষ্কারভাবে ডেটার সাথে সংযুক্ত, তবে এটি একবারে কেবল এক ধরণের পরিচালনা করতে পারে। ফলস্বরূপ, আমার সমস্ত চরিত্রের ভেক্টরগুলি বড়. টেবিলের মধ্যে ফেলে দেওয়ার পরে নেমে এসেছিল। ভবিষ্যতের জন্য যদি আমার বড় ডেটা সেটগুলি ডিজাইনের প্রয়োজন হয় তবে আমি এই বিকল্পটি বাঁচিয়ে রাখতে কেবল সংখ্যা ব্যবহার করার বিষয়টি বিবেচনা করব।
- স্ক্যান
- স্ক্যানের কাছে মনে হয় বড় মেমরির মতো একই ধরণের সমস্যা রয়েছে তবে পঠন লাইনের সমস্ত যান্ত্রিকতার সাথে। সংক্ষেপে, এটি এই সময়টি ঠিক ফিট করে নি।
sed
এবং / অথবাawk
আপনি সরাসরি পড়তে পারেন এমন CSV এর একটি কাটা-ডাউন সংস্করণ তৈরি করে চলে যেতে পারেন। যেহেতু এটি উত্তরের চেয়ে কাজের দিক থেকে বেশি, তাই আমি এটি একটি মন্তব্য হিসাবে রেখে দেব leave