পান্ডাস সহ আমি কীভাবে একটি বড় সিএসভি ফাইল পড়ব?


194

আমি পান্ডায় একটি বৃহত সিএসভি ফাইল (এপ্রোক্স। 6 গিগাবাইট) পড়ার চেষ্টা করছি এবং আমি একটি স্মৃতি ত্রুটি পেয়েছি:

MemoryError                               Traceback (most recent call last)
<ipython-input-58-67a72687871b> in <module>()
----> 1 data=pd.read_csv('aphro.csv',sep=';')

...

MemoryError: 

এই কোন সাহায্য?




উত্তর:


261

ত্রুটিটি দেখায় যে মেশিনটিতে পুরো সিএসভি একবারে ডেটা ফ্রেমে পড়ার মতো পর্যাপ্ত মেমরি নেই। ধরে নিই যে আপনার একসাথে সম্পূর্ণ ডেটাসেটের প্রয়োজন নেই, সমস্যা এড়ানোর এক উপায় হ'ল সিএসভিটিকে খণ্ডে প্রক্রিয়া করা ( chunksizeপ্যারামিটার নির্দিষ্ট করে ):

chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)

chunksizeপরামিতি খণ্ড প্রতি সারির সংখ্যা নির্দিষ্ট করে। (শেষ অংশটি chunksizeঅবশ্যই সারিগুলির চেয়ে কম থাকতে পারে ))


17
কোনও কিছু পড়ার জন্য আপনার সাধারণত 2X চূড়ান্ত মেমরির প্রয়োজন (সিএসভি থেকে, যদিও অন্যান্য ফর্ম্যাটগুলি কম মেমরির প্রয়োজনীয়তা অর্জনে আরও ভাল)। এফওয়াইআই একবারে প্রায় সব কিছু করার চেষ্টা করার জন্য এটি সত্য। এটিকে ছিন্ন করা আরও ভাল (যার একটি ধ্রুবক স্মৃতি ব্যবহার রয়েছে)।
জেফ

24
@ আলতাবাক: এখানে সমস্যা হ'ল আমাদের কাছে একটি ডেটা ফ্রেম তৈরি করার মতো পর্যাপ্ত মেমরি নেই যা সমস্ত ডেটা রাখে। উপরের সমাধানটি এই পরিস্থিতিগুলি মোকাবেলা করার চেষ্টা করে খণ্ডগুলি হ্রাস করে (উদাহরণস্বরূপ কেবলমাত্র পছন্দসই তথ্যকে একত্রিত করে বা বের করে) একবারে এক অংশ - এইভাবে স্মৃতি সঞ্চয় করে। আপনি যা করেন না কেন DF.append(chunk)লুপের মধ্যে কল করবেন না । এটি O(N^2)অনুলিপি অপারেশন ব্যবহার করবে । এটা তোলে সমষ্টিগত তথ্য যোগ করাই ভালো একটি তালিকায় , এবং তারপর সঙ্গে তালিকা থেকে DataFrame গড়ে তুলতে এক কল করার pd.DataFrameবা pd.concat(সমষ্টিগত তথ্য ধরনের উপর নির্ভর করে)।
unutbu

12
@ অলতাবাক: DF.append(chunk)একটি লুপে কল করার জন্য অংশগুলির আকার O(N^2)যেখানে রয়েছে Nতা অনুলিপি করা দরকার , কারণ প্রতিটি কল DF.appendএকটি নতুন ডেটাফ্রেম ফেরত দেয়। লুপের বাইরে কল করা pd.DataFrameবা pd.concat একবার অনুলিপি করার পরিমাণ হ্রাস করে O(N)
unutbu

5
@ পাইডারম্যান: হ্যাঁ, chunksizeপ্যারামিটারটি প্রতি অংশে সারিগুলির সংখ্যা বোঝায়। শেষ অংশটি chunksizeঅবশ্যই সারিগুলির চেয়ে কম থাকতে পারে ।
unutbu

7
@ পাইডারম্যান: হ্যাঁ; লুপের পরে pd.concat([list_of_dfs]) একবার কল করা কল করার চেয়ে অনেক দ্রুত pd.concatবা df.appendলুপের মধ্যে অনেকবার। অবশ্যই, পুরো 6 জিবি সিএসভিকে একটি ডেটা ফ্রেম হিসাবে ধরে রাখতে আপনার যথেষ্ট পরিমাণে মেমরি দরকার।
unutbu

85

এই সমস্যাটির জন্য চুনকিং সর্বদা কলের প্রথম বন্দর হওয়া উচিত নয়।

  1. বারবার অ-সংখ্যাগত ডেটা বা অযাচিত কলামের কারণে ফাইলটি কি বড়?

    যদি তা হয় তবে আপনি কখনও কখনও বিভাগ হিসাবে কলামগুলিতে পড়ে এবং পিডি.রেড_সিএসভি usecols প্যারামিটারের মাধ্যমে প্রয়োজনীয় কলামগুলি নির্বাচন করে বিশাল মেমরি সঞ্চয় দেখতে পারেন ।

  2. আপনার কর্মপ্রবাহের কি টুকরো টুকরো টুকরো টুকরো করা, রফতানি করা দরকার?

    যদি তা হয় তবে আপনি dask.dataframe কে টুকরো টুকরো করতে, আপনার গণনা সম্পাদন করতে এবং পুনরুক্তি রফতানি করতে পারেন । চুনকিং ডেস্কের দ্বারা নিঃশব্দে সঞ্চালিত হয়, যা পান্ডস এপিআইয়ের একটি উপসেটকে সমর্থন করে।

  3. অন্য সমস্ত কিছু যদি ব্যর্থ হয় তবে খণ্ডগুলি হয়ে লাইনে এক করে লাইন পড়ুন।

    পান্ডাসের মাধ্যমে বা সিএসভি লাইব্রেরির মাধ্যমে শেষ অবলম্বন হিসাবে খণ্ডিত


3
আমি দাস্ক সম্পর্কে সচেতন ছিলাম না। +100 তার জন্য!
noamtm

34

আমি এভাবে এগিয়ে গেলাম:

chunks=pd.read_table('aphro.csv',chunksize=1000000,sep=';',\
       names=['lat','long','rf','date','slno'],index_col='slno',\
       header=None,parse_dates=['date'])

df=pd.DataFrame()
%time df=pd.concat(chunk.groupby(['lat','long',chunk['date'].map(lambda x: x.year)])['rf'].agg(['sum']) for chunk in chunks)

22
আপনি থেকে স্যুইচ read_csvকরার কোনও কারণ আছে read_table?
পাইডারম্যান

33

বড় ডেটার জন্য আমি আপনাকে লাইব্রেরি "ডাস্ক" ব্যবহার করার পরামর্শ দিচ্ছি
যেমন:

# Dataframes implement the Pandas API
import dask.dataframe as dd
df = dd.read_csv('s3://.../2018-*-*.csv')

আপনি এখানে ডকুমেন্টেশন থেকে আরও পড়তে পারেন

আর একটি দুর্দান্ত বিকল্প হ'ল মোডিন ব্যবহার করা হবে কারণ সমস্ত কার্যকারিতা পান্ডাদের সমান এবং তবুও এটি ডেস্কের মতো বিতরণকৃত ডেটা ফ্রেম লাইব্রেরিতে লিভারেজ করে।



2
আমি খুব বেশিদিন দাস্ক ব্যবহার করিনি তবে আমার ব্যবহারের ক্ষেত্রে প্রধান সুবিধাগুলি হ'ল ডাস্ক একাধিক মেশিনে সমান্তরালভাবে চলতে পারে, এটি মেমরিতে টুকরা হিসাবেও ডেটা ফিট করতে পারে।
সিম্বারশে টিমোথি মোতসি

2
ধন্যবাদ! পান্ডার প্রতিস্থাপনটি হ'ল বা পান্ডার শীর্ষে স্তর হিসাবে কাজ করে
পাইরেটঅ্যাপ

3
স্বাগতম, এটি নম্পি, পান্ডাস এবং সাইকিট-লার্নের মোড়কের কাজ করে।
সিম্বারশে টিমোথি মটসি

1
আমি ডেস্কের সাথে বেশ কয়েকটি সমস্যার মুখোমুখি হওয়ার চেষ্টা করেছি এবং সবসময় একটি ত্রুটি ছুঁড়ে দিয়েছি। এমনকি খণ্ডগুলি সহ এটি মেমরির ত্রুটিগুলিও ছুঁড়ে দেয়। দেখুন stackoverflow.com/questions/59865572/...
Genarito

10

উপরের উত্তরটি ইতিমধ্যে বিষয়টিকে সন্তুষ্ট করছে। যাইহোক, আপনার যদি মেমরিতে সমস্ত ডেটা প্রয়োজন হয় - বিসিএলজে একবার দেখুন । এটি মেমরিতে ডাটা সংকুচিত করে। এটির সাথে আমার সত্যিই ভাল অভিজ্ঞতা হয়েছে। তবে এর প্রচুর পান্ডাস বৈশিষ্ট্য নেই missing

সম্পাদনা: আমার মনে হয় প্রায় 1/10 বা মূল আকারে আমি সংকোচনের হার পেয়েছি, অবশ্যই ডেটার ধরণের উপর নির্ভর করে। অনুপস্থিত গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি ছিল সমষ্টি।


2
দয়া করে আমাদের এই উত্তরটি উন্নতি করে ক) কোন সংকোচনের অনুপাত পাবেন এবং খ) পান্ডার কোন প্রধান বৈশিষ্ট্য এটি অনুপস্থিত রয়েছে? এটি এনএ পরিচালনা করতে পারে? স্ট্রিং? categoricals? তারিখ?
স্মি

তাই না? এটি এনএ পরিচালনা করতে পারে? স্ট্রিং? categoricals? তারিখ? এই জিনিসগুলি হ'ল পান্ডাস সিএসভির পড়া ধীর এবং স্বস্তিযুক্ত। এনএ এবং স্ট্রিংগুলির মতো বস্তুগুলি (এমনকি ছোটগুলিও) হত্যাকারী। আপনার ব্লগ থেকে রেফারেন্স করা আইপিনবটি বিটিডব্লিউ ডাউন রয়েছে।
smci

1
@ এসএমসিআই আমি আপনাকে নোট পড়ছিলাম। তবে আমি আপনাকে ডক্সের দিকে নজর দেওয়ার পরামর্শ দিচ্ছি। আমার সেগুলি নিজেই পড়তে হবে।
প্লাগটাগ

2
ঠিক আছে সুতরাং এটি এনএ, স্ট্রিং বা তারিখগুলি পরিচালনা করতে পারে না। আমার সন্দেহ হয় এটি কোনওভাবেই ফ্লোট পরিচালনা করতে পারে।
smci

1
আমি মনে করি আপনি chunksউল্লিখিত পদ্ধতিটি ব্যবহার করে পান্ডা দিয়ে প্রস্রোস করতে পারেন, তবে বিশ্লেষণ করার জন্য আপনার যদি মেমরির সমস্ত ডেটা প্রয়োজন হয় তবে বিসিএলজ ব্যবহার করুন। শুধু একটি ভাবনা.
জ্যাকক্টন

6

আপনি খণ্ডগুলি হিসাবে ডেটাতে পড়তে পারেন এবং প্রতিটি অংশকে আচার হিসাবে সংরক্ষণ করতে পারেন।

import pandas as pd 
import pickle

in_path = "" #Path where the large file is
out_path = "" #Path to save the pickle files to
chunk_size = 400000 #size of chunks relies on your available memory
separator = "~"

reader = pd.read_csv(in_path,sep=separator,chunksize=chunk_size, 
                    low_memory=False)    


for i, chunk in enumerate(reader):
    out_file = out_path + "/data_{}.pkl".format(i+1)
    with open(out_file, "wb") as f:
        pickle.dump(chunk,f,pickle.HIGHEST_PROTOCOL)

পরবর্তী পদক্ষেপে আপনি আচারে পড়ুন এবং প্রতিটি আচারকে আপনার পছন্দসই ডেটাফ্রেমে যুক্ত করুন।

import glob
pickle_path = "" #Same Path as out_path i.e. where the pickle files are

data_p_files=[]
for name in glob.glob(pickle_path + "/data_*.pkl"):
   data_p_files.append(name)


df = pd.DataFrame([])
for i in range(len(data_p_files)):
    df = df.append(pd.read_pickle(data_p_files[i]),ignore_index=True)

3
যদি আপনার চূড়ান্ত dfপুরোপুরি মেমরির সাথে ফিট করে (উল্লিখিত হিসাবে) এবং আপনার ইনপুট হিসাবে একই পরিমাণে ডেটা রয়েছে, অবশ্যই আপনার একেবারে খণ্ড খণ্ড খণ্ড দরকার নেই?
জেপিপি

এই ক্ষেত্রে আপনার খণ্ড খণ্ডন করতে হবে, উদাহরণস্বরূপ, যদি আপনার ফাইলটি খুব প্রশস্ত হয় (অনেকগুলি স্ট্রিং কলাম সহ 100 টিরও বেশি কলামের মতো)। এটি মেমরিতে ডিএফ ধরে রাখার জন্য প্রয়োজনীয় স্মৃতি বাড়ায়। এমনকি এর মতো একটি 4 জিবি ফাইলও 64 জিবি র‌্যাম সহ একটি বাক্সে 20 থেকে 30 জিবি র‌্যাম ব্যবহার করে শেষ হতে পারে।
সিডিবেল

4

ফাংশনটি রিড_সিএসভি এবং পঠন-টেবিল প্রায় একই রকম। আপনি আপনার প্রোগ্রামে read_table ফাংশনটি ব্যবহার করার সময় আপনাকে অবশ্যই ডিলিমিটারটি "," বরাদ্দ করতে হবে।

def get_from_action_data(fname, chunk_size=100000):
    reader = pd.read_csv(fname, header=0, iterator=True)
    chunks = []
    loop = True
    while loop:
        try:
            chunk = reader.get_chunk(chunk_size)[["user_id", "type"]]
            chunks.append(chunk)
        except StopIteration:
            loop = False
            print("Iteration is stopped")

    df_ac = pd.concat(chunks, ignore_index=True)

এই পোস্টে আপনার প্রশ্নটি কী তা যদি বলা হয় তবে এটি সহায়তা করবে। "রিড_সিএসভি এবং পঠন-তালিকার মধ্যে পার্থক্য কী?" বা "পড়ার টেবিলটির কেন একটি সীমানার প্রয়োজন?"
nate_weldon

1
এটি আপনার ফাইলটি কেমন দেখাচ্ছে তা নির্ভর করে। কিছু ফাইলের সাধারণ সীমানা থাকে যেমন "," বা "|" বা "\ t" তবে আপনি ডিলিমিটারগুলির সাথে অন্যান্য ফাইলগুলি দেখতে পারেন যেমন 0x01, 0x02 (এটি তৈরি করা) ইত্যাদি So
নওফাল

3

সমাধান 1:

বড় ডেটা সহ পান্ডাস ব্যবহার করা

সমাধান 2:

TextFileReader = pd.read_csv(path, chunksize=1000)  # the number of rows per chunk

dfList = []
for df in TextFileReader:
    dfList.append(df)

df = pd.concat(dfList,sort=False)

3
এখানে আবার আমরা 6 গিগাবাইট ফাইল সম্পূর্ণ স্মৃতিতে লোড করছি, কোনও বিকল্প আছে কি, আমরা বর্তমান
খণ্ডটি

6
শুধু করবেন না dfList.append, কেবল প্রতিটি অংশ ( df) আলাদাভাবে প্রক্রিয়া করুন
gokul_uf

3

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

chunkTemp = []
queryTemp = []
query = pd.DataFrame()

for chunk in pd.read_csv(file, header=0, chunksize=<your_chunksize>, iterator=True, low_memory=False):

    #REPLACING BLANK SPACES AT COLUMNS' NAMES FOR SQL OPTIMIZATION
    chunk = chunk.rename(columns = {c: c.replace(' ', '') for c in chunk.columns})

    #YOU CAN EITHER: 
    #1)BUFFER THE CHUNKS IN ORDER TO LOAD YOUR WHOLE DATASET 
    chunkTemp.append(chunk)

    #2)DO YOUR PROCESSING OVER A CHUNK AND STORE THE RESULT OF IT
    query = chunk[chunk[<column_name>].str.startswith(<some_pattern>)]   
    #BUFFERING PROCESSED DATA
    queryTemp.append(query)

#!  NEVER DO pd.concat OR pd.DataFrame() INSIDE A LOOP
print("Database: CONCATENATING CHUNKS INTO A SINGLE DATAFRAME")
chunk = pd.concat(chunkTemp)
print("Database: LOADED")

#CONCATENATING PROCESSED DATA
query = pd.concat(queryTemp)
print(query)

2

আপনি sframe চেষ্টা করতে পারেন, পান্ডার মতো একই সিনট্যাক্স রয়েছে তবে আপনাকে আপনার র্যামের চেয়ে বড় ফাইলগুলি ম্যানিপুলেট করতে দেয় allows


এসফ্রেম ডক্সের সাথে লিঙ্ক করুন: turi.com/products/create/docs/generated/ographiclab.SFrame.html
ankostis

"এসফ্রেমের ডেটা গ্রাফ ল্যাব সার্ভারের পাশে কলাম অনুসারে সংরক্ষণ করা হয়" এটি কোনও পরিষেবা বা প্যাকেজ?
ড্যানি ওয়াং

2

আপনি যদি পান্ডাস ব্যবহার করেন তবে বড় ফাইল পড়ুন এবং তারপরে সারি সারি সারি ফলন করুন, আমি এখানে যা করেছি তা এখানে

import pandas as pd

def chunck_generator(filename, header=False,chunk_size = 10 ** 5):
   for chunk in pd.read_csv(filename,delimiter=',', iterator=True, chunksize=chunk_size, parse_dates=[1] ): 
        yield (chunk)

def _generator( filename, header=False,chunk_size = 10 ** 5):
    chunk = chunck_generator(filename, header=False,chunk_size = 10 ** 5)
    for row in chunk:
        yield row

if __name__ == "__main__":
filename = r'file.csv'
        generator = generator(filename=filename)
        while True:
           print(next(generator))

1

ইতিমধ্যে সরবরাহ করা বেশিরভাগ সম্ভাব্য সমাধানগুলির ভিত্তিতে আমি আরও বিস্তৃত উত্তর দিতে চাই। আমি আরও একটি সম্ভাব্য সহায়তা উল্লেখ করতে চাই যা পড়া প্রক্রিয়াটি সহায়তা করতে পারে।

বিকল্প 1: dtyype

"ডিটাইপস" একটি দুর্দান্ত শক্তিশালী পরামিতি যা আপনি readপদ্ধতির মেমরির চাপ কমাতে ব্যবহার করতে পারেন । দেখুন এই এবং এই উত্তর। পান্ডস, ডিফল্টরূপে, ডেটাটির টাইপগুলি অনুমান করার চেষ্টা করুন।

ডেটা স্ট্রাকচারের উল্লেখ, প্রতিটি ডেটা সঞ্চিত, একটি মেমরি বরাদ্দ স্থান নেয়। একটি মৌলিক স্তরে নীচের মানগুলি দেখুন (নীচে সারণী সি প্রোগ্রামিং ভাষার মানগুলি চিত্রিত করে):

The maximum value of UNSIGNED CHAR = 255                                    
The minimum value of SHORT INT = -32768                                     
The maximum value of SHORT INT = 32767                                      
The minimum value of INT = -2147483648                                      
The maximum value of INT = 2147483647                                       
The minimum value of CHAR = -128                                            
The maximum value of CHAR = 127                                             
The minimum value of LONG = -9223372036854775808                            
The maximum value of LONG = 9223372036854775807

পড়ুন এই NumPy এবং C ধরনের মধ্যে ম্যাচিং দেখতে পাতা।

ধরা যাক আপনার কাছে সংখ্যার পূর্ণসংখ্যার একটি অ্যারে রয়েছে । আপনি তাত্ত্বিকভাবে এবং ব্যবহারিকভাবে উভয়ই নির্ধারণ করতে পারেন, ১ 16-বিট পূর্ণসংখ্যার ধরণের অ্যারে বলুন, তবে তারপরে আপনাকে আসলে সেই অ্যারেটি সংরক্ষণ করার চেয়ে বেশি মেমরি বরাদ্দ করতে হবে। এটি প্রতিরোধ করতে, আপনি dtypeবিকল্পটি সেট করতে পারেন read_csv। আপনি অ্যারে আইটেমগুলিকে দীর্ঘ পূর্ণসংখ্যার হিসাবে সংরক্ষণ করতে চান না যেখানে আসলে আপনি 8-বিট পূর্ণসংখ্যার ( np.int8বাnp.uint8 ) ।

নিম্নলিখিত dtype মানচিত্র পর্যবেক্ষণ করুন।

সূত্র: https://pbpython.com/pandas_dtyype.html

আপনি dtypeand readকলাম: টাইপ like এর মতো ড্যান্ড হিসাবে পান্ডাস পদ্ধতিতে পরামিতি হিসাবে প্যারামিটারটি পাস করতে পারেন }

import numpy as np
import pandas as pd

df_dtype = {
        "column_1": int,
        "column_2": str,
        "column_3": np.int16,
        "column_4": np.uint8,
        ...
        "column_n": np.float32
}

df = pd.read_csv('path/to/file', dtype=df_dtype)

বিকল্প 2: অংশ দ্বারা পড়া

খণ্ডে ডেটা পড়া আপনাকে মেমোরির উপাত্তের একটি অংশ অ্যাক্সেস করার অনুমতি দেয় এবং আপনি নিজের ডেটাতে প্রিপ্রসেসিং প্রয়োগ করতে পারেন এবং কাঁচা ডেটার পরিবর্তে প্রক্রিয়াজাত ডেটা সংরক্ষণ করতে পারেন। আপনি যদি প্রথমটি, টাইপগুলির সাথে এই বিকল্পটি একত্রিত করেন তবে এটি আরও ভাল

আমি সেই প্রক্রিয়াটির জন্য পান্ডাস কুকবুক বিভাগগুলি উল্লেখ করতে চাই, যেখানে আপনি এটি এখানে খুঁজে পেতে পারেন । সেখানে দুটি বিভাগ নোট করুন;

বিকল্প 3: দশক

ডাস্ক একটি কাঠামো যা ডাসকের ওয়েবসাইটে সংজ্ঞায়িত করা হয় :

ডাস্ক আপনার পছন্দসই সরঞ্জামগুলির জন্য স্কেল পারফরম্যান্স সক্ষম করে বিশ্লেষণের জন্য উন্নত সমান্তরালতা সরবরাহ করে

এটি পণ্ডগুলি পৌঁছাতে পারে না এমন প্রয়োজনীয় অংশগুলি coverাকতে জন্মগ্রহণ করেছিল। ডাস্ক একটি শক্তিশালী কাঠামো যা আপনাকে বিতরণ উপায়ে প্রক্রিয়া করার মাধ্যমে আরও অনেক বেশি ডেটা অ্যাক্সেসের অনুমতি দেয়।

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

অন্যান্য এইডস (ধারণা)

  • ETL প্রবাহ ডেটা জন্য ডিজাইন করা। কাঁচা তথ্য থেকে যা প্রয়োজন তা কেবল রেখে দেওয়া।
    • প্রথমে ডেস্ক বা পাইস্পার্কের মতো ফ্রেমওয়ার্ক সহ পুরো ডেটাতে ইটিএল প্রয়োগ করুন এবং প্রক্রিয়াজাত ডেটা রফতানি করুন।
    • তারপরে দেখুন প্রক্রিয়াজাত ডেটা পুরো মেমরির সাথে ফিট হতে পারে কিনা।
  • আপনার র‌্যাম বাড়ানোর কথা বিবেচনা করুন।
  • ক্লাউড প্ল্যাটফর্মে সেই ডেটা নিয়ে কাজ করার কথা বিবেচনা করুন।

0

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

def apply(dfg):
    # do stuff
    return dfg

c = d6tstack.combine_csv.CombinerCSV([bigfile.csv], apply_after_read=apply, sep=',', chunksize=1e6)

# or
c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'), apply_after_read=apply, chunksize=1e6)

# output to various formats, automatically chunked to reduce memory consumption
c.to_csv_combine(filename='out.csv')
c.to_parquet_combine(filename='out.pq')
c.to_psql_combine('postgresql+psycopg2://usr:pwd@localhost/db', 'tablename') # fast for postgres
c.to_mysql_combine('mysql+mysqlconnector://usr:pwd@localhost/db', 'tablename') # fast for mysql
c.to_sql_combine('postgresql+psycopg2://usr:pwd@localhost/db', 'tablename') # slow but flexible

0

যদি কেউ এখনও এর মতো কিছু সন্ধান করে তবে আমি দেখতে পেলাম যে মোডিন নামক এই নতুন লাইব্রেরি সাহায্য করতে পারে। এটি বিতরণ করা কম্পিউটিং ব্যবহার করে যা পড়তে সহায়তা করতে পারে। পান্ডার সাথে এর কার্যকারিতা তুলনা করার জন্য একটি নিবন্ধ এখানে । এটি মূলত পান্ডার মতো একই ফাংশন ব্যবহার করে।

import modin.pandas as pd
pd.read_csv(CSV_FILE_NAME)

এই নতুন মডিউলটি কীভাবে modinসুপ্রতিষ্ঠিত রয়েছে তার সাথে আপনি কী মন্তব্য করতে পারেন dask.dataframe? উদাহরণস্বরূপ, সমস্ত স্থানীয় সিপিইউ কোর ব্যবহার করতে পান্ডাস থেকে ড্যাস্কে স্থানান্তর দেখুন ।
jpp

0

চুনসাইজ অপশনটি ব্যবহারের আগে যদি আপনি @ ইউনতবু বলে উল্লিখিত চুনকিং-ফর-লুপের ভিতরে যে প্রসেস ফাংশনটি লিখতে চান সে সম্পর্কে নিশ্চিত হতে চান তবে আপনি কেবল নরোস বিকল্পটি ব্যবহার করতে পারেন।

small_df = pd.read_csv(filename, nrows=100)

প্রসেস ব্লক প্রস্তুত হওয়ার বিষয়ে নিশ্চিত হয়ে গেলে আপনি পুরো ডেটাফ্রেমের জন্য লুপের ছাঁটাইতে রেখে দিতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.