التحليل المجزأ باستخدام FParsec
سؤال
هل من الممكن إرسال المدخلات إلى محلل FParsec في أجزاء، اعتبارًا من المقبس؟إذا لم يكن الأمر كذلك، فهل من الممكن استرداد النتيجة الحالية والجزء غير المحلل من دفق الإدخال حتى أتمكن من إنجاز ذلك؟أحاول تشغيل أجزاء المدخلات القادمة من SocketAsyncEventArgs
دون التخزين المؤقت للرسائل بأكملها.
تحديث
سبب ملاحظة الاستخدام SocketAsyncEventArgs
كان للدلالة على أن إرسال البيانات إلى CharStream
قد يؤدي إلى الوصول غير المتزامن إلى الأساسي Stream
.على وجه التحديد، أنا أتطلع إلى استخدام مخزن مؤقت دائري لدفع البيانات الواردة من المقبس.أتذكر وثائق FParsec التي تشير إلى أن الملف الأساسي Stream
لا ينبغي الوصول إليه بشكل غير متزامن، لذلك خططت للتحكم يدويًا في التحليل المقسم.
الأسئلة النهائية:
- هل يمكنني استخدام مخزن مؤقت دائري أسفل ملفي
Stream
مرت إلىCharStream
? - ألا أحتاج إلى القلق بشأن التحكم اليدوي في عملية التقطيع في هذا السيناريو؟
المحلول
الإصدار العادي من FParsec (وإن لم يكن نسخة منخفضة الثقة) يقرأ الإدخال بطريقة القطعة، أو "بطريقة الكتلة"، كما أسميه في ملف CharStream
توثيق.وبالتالي، إذا قمت ببناء CharStream
من System.IO.Stream
والمحتوى كبير بما يكفي ليشمل عدة CharStream
الكتل، يمكنك البدء في التحليل قبل استرداد الإدخال بالكامل.
لاحظ مع ذلك، أن CharStream
سوف يستهلك تدفق الإدخال في أجزاء ذات حجم ثابت (ولكن قابل للتكوين)، أي.سوف يطلق على Read
طريقة System.IO.Stream
كلما كان ذلك ضروريًا لملء كتلة كاملة.ومن ثم، إذا قمت بتحليل المدخلات بشكل أسرع مما يمكنك من استرداد المدخلات الجديدة، فإن CharStream
قد يتم حظره على الرغم من وجود بعض المدخلات التي لم يتم تحليلها بالفعل، لأنه لا يوجد حتى الآن ما يكفي من المدخلات لملء كتلة كاملة.
تحديث
الإجابة (الإجابات) على أسئلتك النهائية: 42.
كيف تقوم بتنفيذ
Stream
الذي تقوم ببناءCharStream
الأمر متروك لك تمامًا.القيد الذي تتذكره والذي يستثني الوصول الموازي ينطبق فقط علىCharStream
فئة، وهي ليست سلسلة آمنة.تنفيذ
Stream
كما من المرجح أن يكون هناك مخزن مؤقت دائري تقييد الحد الأقصى للمسافة التي يمكنك التراجع من خلالها.حجم الكتلة من
CharStream
يؤثر على المدى الذي يمكنك التراجع فيه عندماStream
لا يدعم السعي.إن أبسط طريقة لتحليل الإدخال بشكل غير متزامن هي إجراء التحليل في مهمة غير متزامنة (على سبيل المثال.على موضوع الخلفية).في المهمة، يمكنك ببساطة قراءة المقبس بشكل متزامن، أو إذا كنت لا تثق في التخزين المؤقت بواسطة نظام التشغيل، فيمكنك استخدام فئة دفق مثل
BlockingStream
الموصوفة في المقالة التي قمت بربطها في التعليق الثاني أدناه.إذا كان من الممكن فصل المدخلات بسهولة إلى أجزاء مستقلة (على سبيل المثال.سطورًا لتنسيق نص يستند إلى سطر)، قد يكون من الأفضل تقسيمها بنفسك ثم تحليل قطعة الإدخال قطعة تلو الأخرى.