PDA

View Full Version : خواندن فایل های حجیم



SASAN-BSE
شنبه 29 بهمن 1390, 11:38 صبح
سلام من یه مشکلی با فایل های حجیم دارم وقتی میخوام از read استفاده کنم این ارور رو میده:

Exception of type 'System.OutOfMemoryException' was thrown

از هر دوی این کد ها استفاده کنم بازم همین ارور رو میده:

My.Computer.FileSystem.ReadAllText("F:\text.txt")

یا

IO.StreamReader = New IO.StreamReader("F:\text.txt")
حالا در صورتی که اگه حجم فایل Text من کمتر از 100 مگابایت باشه این ارور داده نمیشه !

sinaone1
شنبه 29 بهمن 1390, 11:42 صبح
شما باید با استفاده از Filestream فایل های بزرگو بخونی

SASAN-BSE
شنبه 29 بهمن 1390, 14:10 عصر
ممنون ولی از این هم استفاده کردم بازم با فایل های بالای 100 مگ مشکل داره:

Dim fs As New FileStream("F:\text.txt", FileMode.Open, FileAccess.Read)



Dim s As New StreamReader(fs)

فرید نجفلو
شنبه 29 بهمن 1390, 14:25 عصر
اگه شما می گفتید برای چه کاری می خواهید فایل رو بخونید دقیقتر راهنمایی می کردیم
در هر حال شما باید فایل رو بلاک به بلاک بخونید

Dim size As Integer = 1 * 1024 * 1024 '1 MB
Dim Bufer(size - 1) As Byte
Using fs As New IO.FileStream("F:\text.txt", IO.FileMode.Open)
fs.Read(Bufer, 0, size)
fs.Close()
End Using
'Use Bufer

شما می تونید با یک Do While کل فیلتون رو با این روش بخونید

SASAN-BSE
شنبه 29 بهمن 1390, 14:38 عصر
ممنون

ببینید من میخوام یه قسمت تو یه فایل رو بخونم (که با اینش مشکل ندارم)

از این استفاده میکنم:

Dim fileReader As IO.StreamReader = New IO.StreamReader("F:\text.txt")


TextBox18.Text = Mid(s.ReadToEnd, &H27)


تو خط دوم میاد به وسیله آدرس HEX که نوشته شده H27 میاد خط 2 و قسمت 7 رو وارد TextBox18.Text میکنه

بدون مشکل کار میکنه ولی وقتی یه فایل بیش از 100 مگی رو بهش میگم نمیتونه ارور میده !

SASAN-BSE
شنبه 29 بهمن 1390, 21:09 عصر
دوستان کسی نبود راهنمایی کنه؟
مشکل من اینه که وقتی یه فایل بیش از 100 مگ رو معرفی میکنم ارور میده وگرنه زیر 100 مگ راحت کار میکنه

GGRRSS_2
شنبه 29 بهمن 1390, 21:36 عصر
ممنون

ببینید من میخوام یه قسمت تو یه فایل رو بخونم (که با اینش مشکل ندارم)

از این استفاده میکنم:

Dim fileReader As IO.StreamReader = New IO.StreamReader("F:\text.txt")


TextBox18.Text = Mid(s.ReadToEnd, &H27)


تو خط دوم میاد به وسیله آدرس HEX که نوشته شده H27 میاد خط 2 و قسمت 7 رو وارد TextBox18.Text میکنه

بدون مشکل کار میکنه ولی وقتی یه فایل بیش از 100 مگی رو بهش میگم نمیتونه ارور میده !

سلام مشكل شما اينه كه اين حجم زياد را در TextBox18 ميخواهيد جاي دهيد از TextBox18 استفاده نكنيد

فرید نجفلو
شنبه 29 بهمن 1390, 21:57 عصر
سلام مشكل شما اينه كه اين حجم زياد را در TextBox18 ميخواهيد جاي دهيد از TextBox18 استفاده نكنيد
نخیر ایشون فقط قسمتی از یک خط رو جای می دهند
من گشتم ولی چیزی واسه دریافت مستقیم پیدا نکردم
اگر شما یک کارکتر خاص (مثلا در محل 5001) رو مد نظر داشتید کار راحت بود ولی یک خط بخصوص رو نمی دونم!!!

شما بهتره با IO.StreamReader.Readline داخل خطوط فایل یه loop بزنید تا به خط مورد نظر برسید و با تابع Mid اطلاعات خودتون رو ازش خارج کنید
فقط با این روش اگه خط در اواسط و آخر فایل باشه خیلی کند عمل می کنه
چون باید تا رسیدن به مکان خط فایل رو بخونه. البته از روش شما سریعتره چون شما چه خط اول رو بخواهد یا خط آخر باید کل فایل خونده بشه!!!

اگه با loop زدن مشکل دارید بگید یه نمونه بزارم

Saman_12
شنبه 29 بهمن 1390, 22:48 عصر
واسه یه قسمت از یک خط خاص میتونید به این روش عمل کنید(به چندین روش میشه عمل کرد فکر کنم این ساده باشه.)

Private Function Getline(ByVal path As String, ByVal line As Int32, ByVal startchar As Int32, ByVal len As Int32) As String

Dim linestr As String = IO.File.ReadAllLines(path)(line)
Dim charstr As String = linestr.Substring(startchar, len)

If len = Nothing Then Return linestr
Return charstr
End Function

SASAN-BSE
شنبه 29 بهمن 1390, 22:56 عصر
نخیر ایشون فقط قسمتی از یک خط رو جای می دهند
من گشتم ولی چیزی واسه دریافت مستقیم پیدا نکردم
اگر شما یک کارکتر خاص (مثلا در محل 5001) رو مد نظر داشتید کار راحت بود ولی یک خط بخصوص رو نمی دونم!!!

شما بهتره با IO.StreamReader.Readline داخل خطوط فایل یه loop بزنید تا به خط مورد نظر برسید و با تابع Mid اطلاعات خودتون رو ازش خارج کنید
فقط با این روش اگه خط در اواسط و آخر فایل باشه خیلی کند عمل می کنه
چون باید تا رسیدن به مکان خط فایل رو بخونه. البته از روش شما سریعتره چون شما چه خط اول رو بخواهد یا خط آخر باید کل فایل خونده بشه!!!

اگه با loop زدن مشکل دارید بگید یه نمونه بزارم

ممنون
نه خط رو نمیخوام یه کارکتر رو میخوام (همونی که خودت گفتی مثلا در محل 5001)
اگه بتونی بدون loop معرفی کنی خیلی خوب میشه:لبخندساده:


واسه یه قسمت از یک خط خاص میتونید به این روش عمل کنید(به چندین روش میشه عمل کرد فکر کنم این ساده باشه.)

Private Function Getline(ByVal path As String, ByVal line As Int32, ByVal startchar As Int32, ByVal len As Int32) As String

Dim linestr As String = IO.File.ReadAllLines(path)(line)
Dim charstr As String = linestr.Substring(startchar, len)

Return charstr
End Function


دمت گرم دارم روی اینم کار میکنم
مرسی

فرید نجفلو
شنبه 29 بهمن 1390, 22:58 عصر
واسه یه قسمت از یک خط خاص میتونید به این روش عمل کنید(به چندین روش میشه عمل کرد فکر کنم این ساده باشه.)

Private Function Getline(ByVal path As String, ByVal line As Int32, ByVal startchar As Int32, ByVal len As Int32) As String

Dim linestr As String = IO.File.ReadAllLines(path)(line)
Dim charstr As String = linestr.Substring(startchar, len)

Return charstr
End Function


ایشون دقیقا با این روش مشکل دارن!!!
وقتی شما کل خطوط رو می خونید((IO.File.ReadAllLines(path) یعنی کل فایل رو خوندید این هم همون مشلک اصلیه!!!

فرید نجفلو
شنبه 29 بهمن 1390, 23:08 عصر
ممنون
نه خط رو نمیخوام یه کارکتر رو میخوام (همونی که خودت گفتی مثلا در محل 5001)
اگه بتونی بدون loop معرفی کنی خیلی خوب میشه:لبخندساده:

حالا شد!:لبخندساده:
Using fs As New IO.FileStream("F:\Text.txt", IO.FileMode.Open)
fs.Position = 5001
Dim Data As Integer = fs.ReadByte
Textbox18.Text = Chr(Data)
fs.Close()
End Using

SASAN-BSE
یک شنبه 30 بهمن 1390, 00:22 صبح
ممنون از همه که کمک کردن درست شد!!!

GGRRSS_2
یک شنبه 30 بهمن 1390, 10:49 صبح
نخیر ایشون فقط قسمتی از یک خط رو جای می دهند
من گشتم ولی چیزی واسه دریافت مستقیم پیدا نکردم
اگر شما یک کارکتر خاص (مثلا در محل 5001) رو مد نظر داشتید کار راحت بود ولی یک خط بخصوص رو نمی دونم!!!

شما بهتره با IO.StreamReader.Readline داخل خطوط فایل یه loop بزنید تا به خط مورد نظر برسید و با تابع Mid اطلاعات خودتون رو ازش خارج کنید
فقط با این روش اگه خط در اواسط و آخر فایل باشه خیلی کند عمل می کنه
چون باید تا رسیدن به مکان خط فایل رو بخونه. البته از روش شما سریعتره چون شما چه خط اول رو بخواهد یا خط آخر باید کل فایل خونده بشه!!!

اگه با loop زدن مشکل دارید بگید یه نمونه بزارم

اين يعني چه TextBox18.Text = Mid(s.ReadToEnd, &H27) مگر دستور s.ReadToEnd تا آخر نمي خونه بجاي textbox از RichTextBox استفاده كنيد

فرید نجفلو
یک شنبه 30 بهمن 1390, 12:53 عصر
اين يعني چه TextBox18.Text = Mid(s.ReadToEnd, &H27) مگر دستور s.ReadToEnd تا آخر نمي خونه بجاي textbox از RichTextBox استفاده كنيد

ببینید دوست من s.ReadToEnd کل فایل رو می خونه و در حافظه نگه می داره و تابع MID از داخل اوون &H27 (یعنی خط 2 و کارکتر 7 ) رو جدا می کنه که در نهایت میشه یک کارکتر (این واسه Textbox خیلی زیاده؟!!!)