অ্যাসিঙ্কনোসিটি সিস্টেম.টেক্সট.জসন ব্যবহার করে একটি তালিকা ডিজেরিয়াল করছে


11

বলি যে আমি একটি বৃহত জসন ফাইলের জন্য অনুরোধ করছি যাতে অনেকগুলি অবজেক্টের একটি তালিকা রয়েছে। আমি চাই না যে সেগুলি একবারে স্মরণে থাকবে, তবে আমি বরং তাদের পড়তে এবং একে একে প্রক্রিয়া করতে চাই। সুতরাং আমার একটি অ্যাসিঙ্ক System.IO.Streamস্ট্রিমটিকে একটি হিসাবে রূপান্তর করা দরকার IAsyncEnumerable<T>। এটি করতে আমি কীভাবে নতুন System.Text.Jsonএপিআই ব্যবহার করব?

private async IAsyncEnumerable<T> GetList<T>(Uri url, CancellationToken cancellationToken = default)
{
    using (var httpResponse = await httpClient.GetAsync(url, cancellationToken))
    {
        using (var stream = await httpResponse.Content.ReadAsStreamAsync())
        {
            // Probably do something with JsonSerializer.DeserializeAsync here without serializing the entire thing in one go
        }
    }
}

1
আপনি সম্ভবত ভালো কিছু করতে হবে DeserializeAsync পদ্ধতি
পাভেল Anikhouski

2
দুঃখিত, মনে হচ্ছে যে উপরের পদ্ধতিটি পুরো স্ট্রিমটি মেমোরিতে লোড করে। আপনি খন্ডে asynchonously ব্যবহার করে ডেটা পড়তে পারে Utf8JsonReader, দয়া করে কিছু GitHub কটাক্ষপাত আছে নমুনার এবং বিদ্যমান এ থ্রেড হিসাবে ভাল
পাভেল Anikhouski

GetAsyncসম্পূর্ণ প্রতিক্রিয়া প্রাপ্ত হলে নিজেই ফিরে আসে । এর SendAsyncপরিবর্তে আপনার `এইচটিএইচটিপি কমপ্লিশন অপশন.সেস্পোনস কনটেন্টিড` ব্যবহার করতে হবে। আপনার কাছে একবার আপনি JSON.NET এর JsonTextReader ব্যবহার করতে পারেন । এই ইস্যুটি দেখায় এরSystem.Text.Json জন্য ব্যবহার করা তত সহজ নয় । কার্যকারিতা উপলব্ধ নেই এবং
স্ট্রট

খণ্ডগুলিতে ডিসরিয়ালাইজিংয়ের সমস্যাটি হ'ল আপনার যখন জানতে হবে ডিসিরিয়ালাইজেশন করার জন্য আপনার সম্পূর্ণ অংশ রয়েছে। সাধারণ ক্ষেত্রে এটি পরিষ্কারভাবে সম্পাদন করা কঠিন হবে। এটির জন্য আগে থেকে পার্সিংয়ের প্রয়োজন হবে, যা পারফরম্যান্সের দিক থেকে বেশ খারাপ ট্রেড অফ হতে পারে। এটি সাধারণকরণ করা বরং কঠিন হবে rather তবে আপনি যদি নিজের জেএসএনে নিজের বিধিনিষেধ প্রয়োগ করেন, বলুন "একটি একক বস্তু ফাইলের ঠিক ২০ টি রেখাকে দখল করে", তবে আপনি খণ্ড অ্যাসিঙ্কে ফাইলটি পড়ে মূলত অ্যাসিঙ্ক্রোনালি ডিসায়ালাইজ করতে পারবেন। আমি এখানে কল্পনা করতে চাই তবে এখানে সুবিধার জন্য আপনার একটি বিশাল জসন দরকার।
গোয়েন্দা

মনে হচ্ছে ইতিমধ্যেই কেউ একটি উত্তরে অনুরূপ প্রশ্ন এখানে পূর্ণ কোড সহ।
পানাগিওটিস কানভোস

উত্তর:


4

হ্যাঁ, সত্যিকারের স্ট্রিমিং জেএসওএন (ডি) সিরিয়ালাইজারটি অনেক জায়গায় ভাল পারফরম্যান্সের উন্নতি হবে।

দুর্ভাগ্যক্রমে, System.Text.Jsonএই সময়ে এটি করবেন না। ভবিষ্যতে এটি হবে কিনা তা সম্পর্কে আমি নিশ্চিত নই - আমিও আশা করি! সত্যিকার অর্থে জেএসএনের ডিসিরিয়ালাইজেশন স্ট্রিমিং বরং চ্যালেঞ্জ হিসাবে প্রমাণিত।

আপনি চূড়ান্তভাবে দ্রুত ইউটিএফ 8 জসন এটি সমর্থন করে কিনা তা পরীক্ষা করতে পারেন ।

তবে আপনার নির্দিষ্ট পরিস্থিতির জন্য একটি কাস্টম সমাধান হতে পারে, যেহেতু আপনার প্রয়োজনীয়তাগুলি অসুবিধা সীমাবদ্ধ বলে মনে হচ্ছে।

ধারণাটি হ'ল একবারে অ্যারে থেকে একটি আইটেম নিজেই পড়ুন। তালিকার প্রতিটি আইটেম নিজে থেকেই, একটি বৈধ জেএসএন বস্তু তা আমরা ব্যবহার করছি।

আপনি ম্যানুয়ালি [(প্রথম আইটেমের জন্য) বা ,(প্রতিটি পরবর্তী আইটেমের জন্য ) এড়িয়ে যেতে পারেন । তারপরে আমি মনে করি যে আপনার বর্তমান বাজিটি ব্যবহার করা হ'ল Utf8JsonReaderবর্তমান কোরটি কোথায় শেষ হবে তা নির্ধারণ করার জন্য নেট নেটগুলি এবং স্ক্যান করা বাইটগুলি খাওয়ানো JsonDeserializer

এইভাবে, আপনি একবারে কেবল একটি বস্তুর উপরে কিছুটা বাফার করছেন।

এবং যেহেতু আমরা পারফরম্যান্সের কথা বলছি, আপনি PipeReaderযখন থাকবেন তখন আপনি একটি থেকে ইনপুট পেতে পারেন। :-)


এটি মোটেও পারফরম্যান্স সম্পর্কে নয়। এটি অ্যাসিঙ্ক ডিসেরায়ালাইজেশন সম্পর্কিত নয় যা এটি ইতিমধ্যে করেছে । এটি স্ট্রিমিং অ্যাক্সেস সম্পর্কে - JSON উপাদানগুলি প্রবাহ থেকে পার্স করা হয় এমনভাবে প্রক্রিয়াজাতকরণ, JSON.NET এর জসনটেক্সট রিডার যেভাবে করে।
পানাজিওটিস কানভোস

ইউটিএফ 8 জসনের প্রাসঙ্গিক শ্রেণিটি হলেন জসনরিডার এবং লেখক যেমনটি বলেছেন, এটি অদ্ভুত। JSON.NET এর JsonTextReader এবং System.Text.Json এর উত্স 8 জসনরেডার একই অদ্ভুততা ভাগ করে - আপনাকে যেতে যেতে বর্তমান উপাদানটির ধরণটি লুপ করে পরীক্ষা করতে হবে।
পানাজিওটিস কানভোস

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

পারফরম্যান্স মানে গতি নয়। ডিসরিয়ালাইজারটি কত দ্রুত হোক না কেন, আপনার যদি 1 এম আইটেম প্রসেস করতে হয় তবে আপনি এগুলি র‍্যামে সঞ্চয় করতে চান না , বা প্রথমটি প্রক্রিয়া করার আগে তাদের সকলকেই ডিসিরিয়ালাইজড হওয়ার জন্য অপেক্ষা করবেন না।
Panagiotis Kanavos

শব্দার্থক, আমার বন্ধু! আমি আনন্দিত যে আমরা সর্বোপরি একই জিনিস অর্জন করার চেষ্টা করছি।
টিমো

4

টিএল; ডিআর এটি তুচ্ছ নয়


দেখে মনে হচ্ছে যে কোনও স্ট্রিমের বাফারগুলি পড়ে এমন কোনও স্ট্রাক্টের জন্য ইতিমধ্যে সম্পূর্ণ কোড পোস্ট করেছেUtf8JsonStreamReader এবং এটি একটি ইউটিএফ 8 জসনআরডারকে ফিড করে, এর সাথে সহজেই বিশৃঙ্খলা মঞ্জুর করে JsonSerializer.Deserialize<T>(ref newJsonReader, options);। কোডটিও তুচ্ছ নয়। সম্পর্কিত প্রশ্ন এখানে এবং উত্তর এখানে

যদিও এটি যথেষ্ট নয় - HttpClient.GetAsyncসম্পূর্ণ প্রতিক্রিয়া পাওয়ার পরে কেবল ফিরে আসবে, মূলত মেমরিতে সমস্ত কিছু বফার করে।

এটি এড়াতে, HTTPClient.GetAsync (স্ট্রিং, এইচটিটিপি কমপ্লায়শন অপশন) ব্যবহার করা উচিত HttpCompletionOption.ResponseHeadersRead

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

এই কোডটি সম্পর্কিত উত্তরের উদাহরণে ভিত্তি HttpCompletionOption.ResponseHeadersReadকরে বাতিলকরণ টোকেন ব্যবহার করে এবং চেক করে। এটি JSON স্ট্রিংগুলিকে পার্স করতে পারে যাতে আইটেমগুলির যথাযথ অ্যারে থাকে eg

[{"prop1":123},{"prop1":234}]

প্রথম কলটি jsonStreamReader.Read()অ্যারের শুরুতে চলে আসে যখন দ্বিতীয়টি প্রথম অবজেক্টের শুরুতে চলে যায়। অ্যারে ( ]) এর শেষটি সনাক্ত হলে লুপটি নিজেই সমাপ্ত হয়।

private async IAsyncEnumerable<T> GetList<T>(Uri url, CancellationToken cancellationToken = default)
{
    //Don't cache the entire response
    using var httpResponse = await httpClient.GetAsync(url,                               
                                                       HttpCompletionOption.ResponseHeadersRead,  
                                                       cancellationToken);
    using var stream = await httpResponse.Content.ReadAsStreamAsync();
    using var jsonStreamReader = new Utf8JsonStreamReader(stream, 32 * 1024);

    jsonStreamReader.Read(); // move to array start
    jsonStreamReader.Read(); // move to start of the object

    while (jsonStreamReader.TokenType != JsonTokenType.EndArray)
    {
        //Gracefully return if cancellation is requested.
        //Could be cancellationToken.ThrowIfCancellationRequested()
        if(cancellationToken.IsCancellationRequested)
        {
            return;
        }

        // deserialize object
        var obj = jsonStreamReader.Deserialize<T>();
        yield return obj;

        // JsonSerializer.Deserialize ends on last token of the object parsed,
        // move to the first token of next object
        jsonStreamReader.Read();
    }
}

জেএসএন টুকরো, একে স্ট্রিমিং জেএসওন ওরফে ... *

পৃথক JSON অবজেক্টগুলিকে কোনও ফাইলে সংযুক্ত করার জন্য ইভেন্ট স্ট্রিমিং বা লগিংয়ের দৃশ্যে এটি বেশ সাধারণ, প্রতি লাইনে একটি উপাদান:

{"eventId":1}
{"eventId":2}
...
{"eventId":1234567}

এটি বৈধ JSON নথি নয় তবে পৃথক টুকরা বৈধ। এটিতে বড় ডেটা / চূড়ান্ত একযোগে পরিস্থিতিগুলির জন্য বিভিন্ন সুবিধা রয়েছে। একটি নতুন ইভেন্ট যুক্ত করার জন্য কেবলমাত্র ফাইলটিতে একটি নতুন লাইন যুক্ত করা দরকার, পুরো ফাইলটিকে পার্সিং এবং পুনর্নির্মাণ নয়। প্রক্রিয়াজাতকরণ , বিশেষত সমান্তরাল প্রক্রিয়াকরণ দুটি কারণে সহজ:

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

স্ট্রিমরিডার ব্যবহার করা

এটি করার জন্য বরাদ্দ-ওয়াইয়ের উপায় হ'ল একটি টেক্সটরিডার ব্যবহার করা, একবারে একটি লাইন পড়ুন এবং এটি জসনসিরাইজার দিয়ে পার্স করুন ese ডিজিটালাইজ করুন :

using var reader=new StreamReader(stream);
string line;
//ReadLineAsync() doesn't accept a CancellationToken 
while((line=await reader.ReadLineAsync()) != null)
{
    var item=JsonSerializer.Deserialize<T>(line);
    yield return item;

    if(cancellationToken.IsCancellationRequested)
    {
        return;
    }
}

কোডের তুলনায় এটি অনেক সহজ যা একটি উপযুক্ত অ্যারের ডিজিটালাইজ করে। দুটি বিষয় আছে:

  • ReadLineAsync বাতিলকরণ টোকেন গ্রহণ করে না
  • প্রতিটি পুনরাবৃত্তি একটি নতুন স্ট্রিং বরাদ্দ করে, আমরা সিস্টেম.টেক্সট.জসন ব্যবহার করে যা এড়াতে চেয়েছিলাম তার মধ্যে একটি

এটি যথেষ্ট হতে পারে যদিওReadOnlySpan<Byte> জসনসিরাইজার দ্বারা প্রয়োজনীয় বাফারগুলি উত্পাদন করার চেষ্টা করা হচ্ছে eseডিজারালাইজেশন তুচ্ছ নয়।

পাইপলাইনস এবং সিকোয়েন্সরিডার

বরাদ্দগুলি এড়াতে, আমাদের ReadOnlySpan<byte>স্ট্রিম থেকে একটি নেওয়া দরকার । এটি করার জন্য System.IO. পাইপলাইন পাইপ এবং সিকোয়েন্সরিডার স্ট্রাক্ট ব্যবহার করা দরকার । স্টিভ গর্ডনের একটি ভূমিকা সিকোয়েন্সরেডার ব্যাখ্যা করে যে কীভাবে এই শ্রেণিটি ডিলিমিটারগুলি ব্যবহার করে কোনও স্ট্রিমের ডেটা পড়তে ব্যবহার করা যেতে পারে।

দুর্ভাগ্যক্রমে, SequenceReaderএকটি রেফ স্ট্রাক্ট যার অর্থ এটি অ্যাসিঙ্ক বা স্থানীয় পদ্ধতিতে ব্যবহার করা যায় না। এজন্য স্টিভ গর্ডন তাঁর নিবন্ধে একটি তৈরি করেছেন

private static SequencePosition ReadItems(in ReadOnlySequence<byte> sequence, bool isCompleted)

আইটেমগুলি পড়ার পদ্ধতিটি একটি ReadOnlySequence গঠন করে এবং শেষের অবস্থানটি ফেরত দেয়, তাই পাইপ রিডার এটি থেকে পুনরায় শুরু করতে পারে। দুর্ভাগ্যবশত আমরা একটি IEnumerable বা IAsyncEnumerable আসতে করতে চান, এবং পুনরুক্তিকারীর পদ্ধতি পছন্দ না inবা outপারেন প্যারামিটার।

আমরা একটি তালিকা বা কাতারে ডিসরিয়ালাইজড আইটেমগুলি সংগ্রহ করতে এবং সেগুলিকে একক ফলাফল হিসাবে ফিরিয়ে দিতে পারি, তবে এটি এখনও তালিকা, বাফার বা নোড বরাদ্দ করে এবং ফিরে আসার আগে বাফারের সমস্ত আইটেমকে ডিসস্রায়াল করার জন্য অপেক্ষা করতে হয়েছিল:

private static (SequencePosition,List<T>) ReadItems(in ReadOnlySequence<byte> sequence, bool isCompleted)

আমাদের এমন কিছু দরকার যা একটি পুনরাবৃত্তকারী পদ্ধতির প্রয়োজন ছাড়াই একটি গণনার মতো কাজ করে, অ্যাসিঙ্কের সাথে কাজ করে এবং সমস্ত কিছু বাফার করে না।

একটি IAsyncEnumerable উত্পাদন করতে চ্যানেল যুক্ত করা

ChannelReader.ReadAllAsync একটি IAsyncEnumerable ফেরৎ। আমরা এমন পদ্ধতিগুলি থেকে চ্যানেল রিডার ফিরিয়ে দিতে পারি যা পুনরাবৃত্তকারী হিসাবে কাজ করতে পারে না এবং এখনও ক্যাশে ছাড়াই উপাদানগুলির একটি স্ট্রিম উত্পাদন করে।

চ্যানেলগুলি ব্যবহার করার জন্য স্টিভ গর্ডনের কোডটি মানিয়ে নেওয়া, আমরা রিড আইটেমগুলি (চ্যানেল লেখক ...) এবং ReadLastItemপদ্ধতিগুলি পাই । প্রথম এক, একটি সময়ে একটি আইটেম সার্চ, একটি newline ব্যবহার পর্যন্ত ReadOnlySpan<byte> itemBytes। এটি দ্বারা ব্যবহার করা যেতে পারে JsonSerializer.Deserialize। যদি ReadItemsডিলিমিটারটি খুঁজে না পায় তবে এটি তার অবস্থানটি ফিরিয়ে দেয় যাতে পাইপলাইনার্ডার পরবর্তী অংশটিকে প্রবাহ থেকে টানতে পারে।

যখন আমরা শেষ খণ্ডে পৌঁছায় এবং অন্য কোনও ডিলিমিটার নেই, রিডলাস্ট আইটেম` বাকি বাইটগুলি পড়ে সেগুলি ডিসরিয়ালাইজ করে।

কোডটি স্টিভ গর্ডনের মতো প্রায় একই রকম। কনসোলটিতে লেখার পরিবর্তে আমরা চ্যানেল রাইটারে লিখি।

private const byte NL=(byte)'\n';
private const int MaxStackLength = 128;

private static SequencePosition ReadItems<T>(ChannelWriter<T> writer, in ReadOnlySequence<byte> sequence, 
                          bool isCompleted, CancellationToken token)
{
    var reader = new SequenceReader<byte>(sequence);

    while (!reader.End && !token.IsCancellationRequested) // loop until we've read the entire sequence
    {
        if (reader.TryReadTo(out ReadOnlySpan<byte> itemBytes, NL, advancePastDelimiter: true)) // we have an item to handle
        {
            var item=JsonSerializer.Deserialize<T>(itemBytes);
            writer.TryWrite(item);            
        }
        else if (isCompleted) // read last item which has no final delimiter
        {
            var item = ReadLastItem<T>(sequence.Slice(reader.Position));
            writer.TryWrite(item);
            reader.Advance(sequence.Length); // advance reader to the end
        }
        else // no more items in this sequence
        {
            break;
        }
    }

    return reader.Position;
}

private static T ReadLastItem<T>(in ReadOnlySequence<byte> sequence)
{
    var length = (int)sequence.Length;

    if (length < MaxStackLength) // if the item is small enough we'll stack allocate the buffer
    {
        Span<byte> byteBuffer = stackalloc byte[length];
        sequence.CopyTo(byteBuffer);
        var item=JsonSerializer.Deserialize<T>(byteBuffer);
        return item;        
    }
    else // otherwise we'll rent an array to use as the buffer
    {
        var byteBuffer = ArrayPool<byte>.Shared.Rent(length);

        try
        {
            sequence.CopyTo(byteBuffer);
            var item=JsonSerializer.Deserialize<T>(byteBuffer);
            return item;
        }
        finally
        {
            ArrayPool<byte>.Shared.Return(byteBuffer);
        }

    }    
}

DeserializeToChannel<T>পদ্ধতি, স্ট্রিম উপরে একটি পাইপলাইন পাঠক সৃষ্টি একটি চ্যানেল তৈরি করে এবং একজন শ্রমিক কাজের শুরু হয় যে পার্স খন্ডে তাদের push কর্মের চ্যানেলে:

ChannelReader<T> DeserializeToChannel<T>(Stream stream, CancellationToken token)
{
    var pipeReader = PipeReader.Create(stream);    
    var channel=Channel.CreateUnbounded<T>();
    var writer=channel.Writer;
    _ = Task.Run(async ()=>{
        while (!token.IsCancellationRequested)
        {
            var result = await pipeReader.ReadAsync(token); // read from the pipe

            var buffer = result.Buffer;

            var position = ReadItems(writer,buffer, result.IsCompleted,token); // read complete items from the current buffer

            if (result.IsCompleted) 
                break; // exit if we've read everything from the pipe

            pipeReader.AdvanceTo(position, buffer.End); //advance our position in the pipe
        }

        pipeReader.Complete(); 
    },token)
    .ContinueWith(t=>{
        pipeReader.Complete();
        writer.TryComplete(t.Exception);
    });

    return channel.Reader;
}

ChannelReader.ReceiveAllAsync()এর মাধ্যমে সমস্ত আইটেম গ্রাস করতে ব্যবহার করা যেতে পারে IAsyncEnumerable<T>:

var reader=DeserializeToChannel<MyEvent>(stream,cts.Token);
await foreach(var item in reader.ReadAllAsync(cts.Token))
{
    //Do something with it 
}    

0

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


-2

আপনি Newtonsoft.Jsonসিরিয়ালাইজার ব্যবহার করতে পারে ? https://www.newtonsoft.com/json/help/html/Performance.htm

বিশেষ করে বিভাগ দেখুন:

মেমরির ব্যবহারটি অনুকূলিত করুন

সম্পাদন করা

আপনি JsonTextReader, উদাহরণস্বরূপ মূল্যবোধকে deserializing চেষ্টা করতে পারেন

using (var textReader = new StreamReader(stream))
using (var reader = new JsonTextReader(textReader))
{
    while (await reader.ReadAsync(cancellationToken))
    {
        yield return reader.Value;
    }
}

যে প্রশ্নের উত্তর দেয় না। এই সব সময়ে কর্মক্ষমতা সম্পর্কে নয় এটিকে অ্যাক্সেস স্ট্রিমিং সম্বন্ধে ছাড়া মেমরি সবকিছু লোড
Panagiotis Kanavos

আপনি কি সম্পর্কিত লিঙ্কটি খোলেন বা আপনার মতামতটি কেবল বলেছেন? আমি যে বিভাগটিতে প্রেরণ করেছি তাতে লিঙ্কটিতে আমি উল্লেখ করেছি যে কীভাবে স্রোত থেকে জেএসএনকে deserialize করা যায় তার একটি কোড স্নিপেট রয়েছে।
মিয়োসজ উইকজোরেক

দয়া করে আবার প্রশ্নটি পড়ুন - ওপিতে মেমরির সমস্ত কিছুর ডিজিটালাইজেশন না করে কীভাবে উপাদানগুলিকে প্রক্রিয়াজাত করতে হয় তা জিজ্ঞাসা করে । শুধু একটি স্ট্রিম থেকে পড়া নয়, কেবল স্ট্রিম থেকে কী আসে তা প্রক্রিয়া করুন। I don't want them to be in memory all at once, but I would rather read and process them one by one.JSON.NET- এ প্রাসঙ্গিক শ্রেণি হ'ল JsonTextReader।
পানাজিওটিস কানভোস

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