1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

c# нехватка memory

Тема в разделе 'C/C++', создана пользователем Fituchini, 17 июл 2018.

  1. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    Доброго времени суток граждане. Подскажите пожалуйста с pck архивом.
    два ключа
    PHP:
     public static int KEY_1 = -1466731422;
            public static 
    int KEY_2 = -240896429;
    упаковка идёт следующим образом
    PHP:
     public static void pack(string dir)
            {
              
              
                
    string pck dir.Replace(".arch\\""").Replace(".arch""") + "x";
                 
    string[] files Directory.GetFiles(dir"*"SearchOption.AllDirectories);
                  
    MessageBox.Show("В каталоге найдено файлов: " files.Length " ,
                    "
    info", MessageBoxButtons.OK, MessageBoxIcon.Information);
                for (int a = 0; a < files.Length; ++a)
                {
                    files[a] = files[a].Replace(dir, "").Replace("
    /", "\\").Remove(0, 1);
                }
                long fileTableOffset = 0;
                List<fileTableEntry> fileTable = new List<fileTableEntry>();
                BinaryWriter bw = new BinaryWriter(new FileStream(pck, FileMode.Create, FileAccess.ReadWrite));
                bw.Write(FSIG_1);
                bw.Write(0);
                bw.Write(FSIG_2);
                for (int a = 0; a < files.Length; ++a)
                {
                    fileTableEntry fte = new fileTableEntry();
                    MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(dir + "
    \\" + files[a]));
                    fte.filePath = files[a];
                    fte.fileDataOffset = (uint)bw.BaseStream.Position;
                    fte.fileDataDecompressedSize = (int)fileMs.Length;
                    MemoryStream ms = new MemoryStream();
                    CompressStream(fileMs, ms, (int)fileMs.Length);
                    byte[] buffer = ms.ToArray();
                    fte.fileDataCompressedSize = buffer.Length;
                    bw.Write(buffer);
                    fileTable.Add(fte);
                    string tmp_Y = string.Format(" 
    \rЗаписано файлов: {0}/{1}\r\n", a, files.Length);
                    File.AppendAllText(@"
    pack.log", DateTime.Now.ToLongDateString()+ " в " + DateTime.Now.ToLongTimeString() + tmp_Y);
                   }
                fileTableOffset = bw.BaseStream.Position;
              
            
                for (int a = 0; a < fileTable.Count; ++a)
                {
                    byte[] buffer = writeTableEntry(fileTable[a]);
                    bw.Write(buffer.Length ^ KEY_1);
                    bw.Write(buffer.Length ^ KEY_2);
                    bw.Write(buffer);
                    string tmp_Z = string.Format(" 
    \rЗаписано таблиц файлов: {0}/{1}\r\n", a, fileTable.Count);
                    File.AppendAllText(@"
    pack.log", DateTime.Now.ToLongDateString() + " в " + DateTime.Now.ToLongTimeString() + tmp_Z);
                  
                }
                bw.Write(ASIG_1);
                bw.Write((short)2);
                bw.Write((short)2);
                bw.Write((uint)(fileTableOffset ^ KEY_1));
                bw.Write(0);
                bw.Write(Encoding.Default.GetBytes("
    Angelica File PackagePerfect World."));
                byte[] nuller = new byte[215];
                bw.Write(nuller);
                bw.Write(ASIG_2);
                bw.Write(fileTable.Count);
                bw.Write((short)2);
                bw.Write((short)2);
                bw.BaseStream.Seek(4, SeekOrigin.Begin);
                bw.Write((uint)bw.BaseStream.Length);
                bw.Close();
                Split(pck);
              
            }
    Почему при архивировании фалов весом ~2.5Гб говорит о нехватке memory?
    неужели максимально pck архив 2147483392 байта(как написано в гайде)? ведь максимальное значение 2147483647 - ну допустим ошибка
    как то можно увеличить лимит?
    Допустим unsigned _int32 или int64.
    или ограничено типизацией?
  2. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    773
    Лайки:
    771
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Во-первых, скинь весь код, у тебя есть самописные объекты.
    Во-вторых, покажи строчку с эксепшеном.
    В-третьих, дай точное сообщение исключения.
    Последнее редактирование: 17 июл 2018
  3. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    Прикрепил.
    альтернативная ссылка ЯД

    Вложения:

    • pckTest.zip
      Размер файла:
      403,2 КБ
      Просмотров:
      2
  4. dpakon1 Пользователи

    Сообщения:
    101
    Лайки:
    13
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    myself
    Максимальный размера пака 2ГБ, если размер превышает, то создается кусок *.pkx (склейка с .pck).
    Предполагаю, что ехе работает с обычным типом int, поэтому не получится просто юзать у себя uint.
    Посмотри в сторону архива models.pck + pkx
  5. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    В том то и дело что не создается. Ругается на memory

    Меня не интересует как работает elementclient.exe. Задача стоит в том, чтобы создавались просто архивы весом более 2ГБ
  6. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    [​IMG]


    "Невозможно создать файл так как он уже существует"
    Последнее редактирование: 18 июл 2018
  7. Ацкой Nyan of Steel Группа анонимных алкоголиков Art Old school Пользователи

    Сообщения:
    403
    Лайки:
    477
    Пол:
    Мужской
    Репутация:
    4
    Команда:
    DeBalance Art Team
    Страна:
    Russian Federation Russian Federation
    Я, конечно, ниипу в управление памятью от слова совсем, но
    Код:
     for (int a = 0; a < files.Length; ++a)
                {
                    fileTableEntry fte = new fileTableEntry();
                    MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(dir + "\\" + files[a]));
                    fte.filePath = files[a];
                  ...
    
    для каждого файла в директории создает поток, в который грузит его содержимое. ГК, поидее, должен его прибить, но мб этого не делает. Лучше снапшоты производительности приложения еще запостить и попробовать:
    Код:
    foreach(var file in System.IO.Directory.GetFiles(dir)){
    using (MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(file))){
    ...
    }
    };
    Или принудительно диспозить стрим в конце итерации.
  8. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    Ты имеешь ввиду MemoryStream диспозить?
  9. TopicStarter Overlay

    Fituchini Пользователи

    Сообщения:
    315
    Лайки:
    67
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    PWCD
    Страна:
    Russian Federation Russian Federation
    для теста взял простой pwpack и попробовал сжать папку в ~30Гб. Без проблем сжал в архив в 15Гб и без проблем распаковал без всяких pkx
  10. LiptoN[Triton] Пользователи

    Сообщения:
    441
    Лайки:
    209
    Пол:
    Мужской
    Репутация:
    2
    Страна:
    Russian Federation Russian Federation
    Ацкой все верно сказал, что нужно освобождать память.
    Приучись использовать using и реализовывать интерфейс IDisposable, а то далеко так не уйдешь.
    Так же используй интерполяцию строк ($"Найдено файлов: {files.Count}").
    Так же используй Environment.NewLine, а не "\r\n".
    Названия классов в C# принято называть в CamelCase, а не lowerCamelCase.
    Поля класса должны быть закрыты, а св-ва открыты, св-ва всегда называются в CamelCase.
    Публичные методы тоже CamelCase, приватные lowerCamelCase.

    Понабираются херни у кнайфов всяких, а потом спрашивают где они сделали ошибку, а ошибка была в том, что ты посмотрел его код.
  11. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    773
    Лайки:
    771
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Памяти у тебя не хватает на это дело. Переделай алгоритм нормально. Или планок сотню напихай.
  12. freepvps Пользователи

    Сообщения:
    42
    Лайки:
    59
    Репутация:
    11
    Команда:
    no
    Лол, читаем весь файл, чтобы сунуть его в поток :/
    File.Open юзай и наверни buffer-size какой-нибудь норм, например, 1мб, по скорости будет так же, но не будет течи памяти
    --- добавлено: 12 сен 2018 в 16:07 ---
    Черт, это было в июле
    Последнее редактирование модератором: 20 сен 2018
Черновик сохранён Черновик удалён

Поделиться этой страницей