Skip to content

PoltP/ParallelPacker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

16 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‰ΠΈΠΊ (Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€) Ρ„Π°ΠΉΠ»Π°

ParallelPacker compress/decompress [source file path] [result file path]

ParallelPacker pack/unpack [source file path] [result file path]

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ExitCode: 0 - Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, 1 - ΠΏΡ€Π΅Ρ€Π²Π°Π½ΠΎ ΠΈΠ·-Π·Π° Π²ΠΎΠ·Π½ΠΈΠΊΡˆΠΈΡ… ошибок Π² процСссС выполнСния, 2 - ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°: .NET Core 3.0

О Π·Π°Π΄Π°Ρ‡Π΅:

Π—Π°Π΄Π°Ρ‡Π° ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΉ Producer/Consumer ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Если ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ±Π»ΠΎΡ‡Π½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ исходного ΠΈ поблочная запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅ нуТдаСтся Π² распараллСливании (Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла ΠΈΠ»ΠΈ Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°) ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ (ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°/распаковка), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Producer/Consumer-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ, см. простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Java Locking Queue.

ΠžΠ±Ρ‰Π΅Π΅ описаниС:

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ†ΠΈΠΈ (ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС ΠΊΠ°ΠΊ слоТный ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ субконвСйСры Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ источники ΠΈ/ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΡ‰ΠΈΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠ². Π‘ΡƒΠ±ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π»ΠΈΠ±ΠΎ ΠΈ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ. Π Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΈ Π±Π΅Ρ€ΡƒΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ субконвСйСра, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ (Ссли Π½ΡƒΠΆΠ½ΠΎ) ΠΈ ΠΊΠ»Π°Π΄ΡƒΡ‚ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ Π½Π°Ρ‡Π°Π»Π΅ происходит взятиС [i]-ΠΎΠΉ части исходного Ρ„Π°ΠΉΠ»Π° (Π±Π»ΠΎΠΊΠ° с индСксом [i]) ΠΎΠ΄Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΅Π³ΠΎ дальшС Π² Ρ†Π΅Π½Ρ‚Ρ€. Π’ Ρ†Π΅Π½Ρ‚Ρ€Π΅ мноТСство Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠ² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ производят ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ (ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ/распаковку) ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ†. Π’ ΠΊΠΎΠ½Ρ†Π΅ происходит сохранСниС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠΌ (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ Π½Π΅ ΠΏΠΎ порядку индСкса [i], Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Π»ΠΈΠ±ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ с индСксом).

Schema Начало-Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ (взятиС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π² субконвСйСр считанных Π±Π»ΠΎΠΊΠΎΠ²).

Π¦Π΅Π½Ρ‚Ρ€-ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅-ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ (взятиС Π±Π»ΠΎΠΊΠΎΠ² ΠΈΠ· субконвСйСра считанных Π±Π»ΠΎΠΊΠΎΠ², ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π² субконвСйСр Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΎΠ²).

ΠšΠΎΠ½Π΅Ρ†-НазначСниС (взятиС Π±Π»ΠΎΠΊΠΎΠ² ΠΈΠ· субконвСйСра Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ»).

Для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²-Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с субконвСйСрами Π½Π° взятиС/ΠΎΡ‚Π΄Π°Ρ‡Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:

  1. Β«ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉΒ» ΠΈΠ· Β«Π ΠΈΡ…Ρ‚Π΅Ρ€ Π”ΠΆΠ΅Ρ„Ρ„Ρ€ΠΈ, CLR via C#. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Microsoft.NET Framework 4.5 Π½Π° языкС C#, стр. 800Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ a priori Π±ΠΎΠ»Π΅Π΅ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ядра ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Monitor. Но ΠΊΡ€Π°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ класс Monitor Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ привязку ΠΏΠΎΡ‚ΠΎΠΊΠ° - ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π΄ΠΎΠ»ΠΆΠ΅Π½ сам ΡΠ½ΡΡ‚ΡŒ Π΅Π΅, Π²Ρ‹Π·Π²Π°Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Monitor.Exit, Ρ‡Ρ‚ΠΎ, тСорСтичСски, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… сцСнариях, Π½Π΅ смотря Π½Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΡŽ взаимодСйствия ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² посрСдством Monitor.Wait, Monitor.Pulse ΠΈ Monitor.PulseAll.
  2. Semaphor’ы (ΠΈ ΠΈΡ… Slim-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ для синхронизации Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сСмафор Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ привязку ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ сСмафор, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ.
  3. Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ - Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ/Π»ΠΎΠΊΠΈ, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Interlocked - это ΠΏΠΎΠ²ΠΎΠ΄ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ исслСдования.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии

  1. НС поддСрТиваСтся стандартный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ GZip, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ стандартный GZip-Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€ Π½Π΅ распознаСт Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° ParallelPacker. НСобходимо Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, ΠΈΠ·ΡƒΡ‡ΠΈΠ² GZip Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.
  2. ΠŸΡ€ΠΈ сохранСнии ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π±Π»ΠΎΠΊΠΈ Π½Π΅ упорядочСны ΠΏΠΎ индСксу. МоТно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Min Heap (ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ) ΠΏΠΎ индСксу Π±Π»ΠΎΠΊΠ° ΠΈ Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° случай ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€ΠΎΠΌ (для этого достаточно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ IPackerEngine), Π½ΠΎ ΠΈ Π½Π° любой случай распараллСливания, подходящий ΠΏΠΎΠ΄ схСму процСсса ParallelPacker

About

.NET multithreading file packer

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages