Рассматриваемый код (ниже) читается намного быстрее (в 30 раз), чем обычно: MemoryMappedViewAccessor.ReadArray() Я пытаюсь изменить код, чтобы иметь возможность читать с длинного смещения, а не с int (!)
public unsafe byte[] ReadBytes(int offset, int num)
{
byte[] arr = new byte[num];
byte *ptr = (byte*)0;
this._view.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);
Marshal.Copy(IntPtr.Add(new IntPtr(ptr), offset), arr, 0, num);
this._view.SafeMemoryMappedViewHandle.ReleasePointer();
return arr;
}
исходный код здесь: Как быстро прочитать байты из файла с отображением памяти в .NET?_
Мне нужно настроить IntPtr.Add и Marshal.Copy для правильной работы с длинным смещением Заранее спасибо!
Уважаемый Эльдар! Спасибо за быстрый ответ - как я вижу, Marshal.Copy копирует указатель в определенное место - я не вижу возможности выполнить итерацию как int-s - пожалуйста, объясните свою идею!
С помощью этого ответа. Предположим, что ваше смещение теперь равно двум целочисленным значениям, поэтому ваш последний указатель будет таким: var finalPtr =IntPtr.Add(IntPtr.Add(new IntPtr(ptr), offsets[0]),offsets[1])
new IntPtr(intPtr.ToInt64() + longOffset)
Конечно, это работает только в 64-битных процессах.
Ты спасатель жизни! Работает как шарм:
Спасибо, Клаус Гюттер! Полный рабочий код на основе предложенного вами метода:
public static unsafe byte[] ReadBytes(long l_offset, int i_read_buf_size, MemoryMappedViewAccessor mmva)
{
byte[] arr = new byte[i_read_buf_size];
byte* ptr = (byte*)0;
mmva.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);
IntPtr p = new(ptr);
Marshal.Copy(new IntPtr(p.ToInt64() + l_offset), arr, 0, i_read_buf_size);
mmva.SafeMemoryMappedViewHandle.ReleasePointer();
return arr;
}
Вам не нужно иметь
long
смещение. Вы можете разделить свое длинное значение на целые числа и перебирать эти значения.