Возможно получить доступ к большим структурам данных, загруженным в другой процесс из C #? - PullRequest
1 голос
/ 25 октября 2019

У меня есть приложение, которое запускает много потоков параллельно, каждый из которых обрабатывает одни и те же сотни ГБ только для чтения, никогда не меняя данные по-разному. Даже с ZeroFormatter требуется время, чтобы загрузить все данные в память, прежде чем запускать каждый прогон. Я хотел бы исключить это ожидание.

В C # возможно ли, чтобы один процесс загружал данные в память и постоянно их сохранял, а другой процесс, запущенный позже, эффективно получал доступ к данным? место?

Редактировать:

Хорошо, мои извинения за то, что я не включил достаточно соответствующей информации. Я обрабатываю последовательные данные временных рядов на очень мощном оборудовании с половиной терабайта памяти. До сих пор потоковая передача данных с диска и их постепенная обработка, что обычно и происходит, выполняется медленнее, чем загрузка всех данных в первую очередь, поскольку процесс не ограничен ЦП, но ограничена пропускная способность памяти для ЦП. Я хотел просто сохранить все это в памяти и пропустить шаг, который занимает больше всего времени.

У меня возникает желание снять вопрос или, по крайней мере, пометить комментарий как ответ. Если процесс для обработки доступа к памяти очень медленный, то на самом деле нет никакого способа ускорить его, потому что я уже делю данные по ядру NUMA.

1 Ответ

1 голос
/ 25 октября 2019

Взгляните на сопоставленные файлы памяти . Основная предпосылка заключается в том, что каждый процесс «думает», что он загружает свой собственный файл, но в действительности все они используют один и тот же физический вид.

class Program
{
static void Main(string[] args)
{
    long offset = 0x10000000; // 256 megabytes
    long length = 0x20000000; // 512 megabytes

    // Create the memory-mapped file.
    using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
    {
        // Create a random access view, from the 256th megabyte (the offset)
        // to the 768th megabyte (the offset plus length).
        using (var accessor = mmf.CreateViewAccessor(offset, length))
        {
            int colorSize = Marshal.SizeOf(typeof(MyColor));
            MyColor color;

            // Make changes to the view.
            for (long i = 0; i < length; i += colorSize)
            {
                accessor.Read(i, out color);
                color.Brighten(10);
                accessor.Write(i, ref color);
            }
        }
    }
}
}

public struct MyColor
{
public short Red;
public short Green;
public short Blue;
public short Alpha;

// Make the view brighter.
public void Brighten(short value)
{
    Red = (short)Math.Min(short.MaxValue, (int)Red + value);
    Green = (short)Math.Min(short.MaxValue, (int)Green + value);
    Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
    Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...