Q: We have a huge job which takes pretty long to print. As we have several printers (4) we would like to split any job with more then 100 pages in 4 jobs. So the print is taking about 1/4th time to being printed.

There are two solutions for splitting larger jobs into pieces for fast distributed printing:

  • Use ELPs and distribute the job to X queues, where the job can be splitted in variable portions, according the single printer speeds
  • When you have x printers with same speed, split into one queue with same portions and use the Windows pooling function, to let windows decide where to print.

In both cases only one ELP license is needed. An overview of different job distribution methods can be seen here.

A: The first solution is to use the Split_section method:

Work load balancing means, that several printers are available, maybe with different printer speeds, and one big job is distributed to those printers that all are printing one piece of the job, and that they finish at the same time. So time optimized printing.

Note: Currently ELP does not handle duplexed jobs. This means a job can be split on the front page of the job, so the actual back page could become the front page of the split part. If this causes problems, please let the developers know.

The implementations needs minimum one ELP activated queue, which receives the incoming data. Instead of printing this data stream, it will be splitted into X pieces, depending upon the amount X of available printers.

Those split job receiving queues are normally NOT(!) ELP activated. If all printers to have the same speed, then one print queue is quite enough, but then the MS Windows function "printer pool" must be used. Meaning that in the real printing queues, in the driver properties - port definition simply select the "printer pool activation" mark. So MS Windows will distribute automatically any arriving job to the next free printer. The disadvantage is that not all printers might get the same work load. If this is needed do not use Pooling functionality.

Due to the expected huge print jobs, set the buffer handling to the maximum larges buffer size, otherwise a 200 MByte data stream could generate more then 100.000 input buffers, whose administration will eat a horrible portion of the available PC power. This is done through the key Max_ReadBuffer.

If  printers with different printing speed are used, then the splitting function can split the job in different sized portions, so all printers will finish pretty much at the same time.

So please install now for every printing printer one queue including the definition of a share name. Install also an additional printer queue, which has to be ELP activated and will receive the incoming data. When this receiving queue does not print, set it to port null.

[Global]

Preparsing=ON

; calculates while reading the data stream the amount of pages

NoPrinting=ON

; Do not print this stream

Max_ReadBuffer=16384

; increase buffer for this kind of handling to increase speed by about 20%

PortCoverSheet=22000;\x1B&l26a0o4H

; If the printing parts are supposed to have a cover sheet, use the key PortCoverSheet. This key has 2 arguments separated by semicolon:
; - A macro number which contains all collected variables who are supposed to help to sort the splitted job into the correct page order (ELP provides macro 22000).

; - Any needed initialization sequences for the cover sheet, that it is drawn  out of the wished tray and put into the selected out-tray.

 

[If more then 100 pages split to 4 different printers]

Trigger_Binary=1

; primary trigger is always true

Trigger_Variable=#PREPARSEPAGECOUNT#>100

; Secondary trigger, if true, then:

Split_Section=MySplitSection

; Split the job according to this Workload balancing numbers:

OutPortMode_CollectFonts=ON

; Collect all stuff and insert it in front of each part, that the part can be printed fully independantly

[MySplitSection]

SplitPageCounter=#PREPARSEPAGECOUNT#

; Tell the ELP split function which variable does have the total page count

Split1=25;\\#HOSTNAME#\ELPSplit

Split2=50;\\#HOSTNAME#\ELPSplit

Split3=75;\\#HOSTNAME#\ELPSplit

Split4=100;\\#HOSTNAME#\ELPSplit

; Then split to those printers: Instead of the #HOSTNAME# variable, you may use any UNC path and printer share name, or simply: 127.0.0.1

This example splits the job in 4 pieces and sends them into the same Windows printer queue which has the printer pooling function enabled with 4 defined ports to printers with the same speed defined.

Two keys advice ELP how to split the stream into X portions and sent to which printer:

SplitPageCounter tells ELP which pre-processor variable does contain the total amount of pages of this job
SPLIT1=, SPLIT2=
up to SPLIT=X
do inform ELP about the percentage of the strip size and the port (printer share name) the strip data is sent to. For the version where a printer pool is used, the port will always be the same, just the pooling activated receiving queue. So the key option is the maximum percentage of the strip size between 1 and 100 a semicolon and the definition of the share name of the printer which should print the strip.

 

Notes:

  1. If the incoming queue will only get such big print jobs then just move the Split_Section key into the rule Global and erase the rest of the second section.
  2. In rare cases the key \\#HOSTNAME# does not work. You may substitute it with \\127.0.0.1 or #PCNAME#
  3. According to the ELP license regulations this solution needs 4 licenses. Although the receiving queue must not be activated in ELP!
  4. If you have printers with different speeds then change the last rule to:

[MySplitSection]

SplitPageCounter=#PREPARSEPAGECOUNT#

Split1=50;\\#HOSTNAME#\Printer1

; The first queue shared as Printer1 has a printer with 100 pages per minute connected

Split2=75;\\#HOSTNAME#\Printer2

Split3=100;\\#HOSTNAME#\Printer3

; The other two queues have printer attached with 50 pages per minute.

The disadvantage of this first solution is that each part is restarted at the beginning and ends at the designate page. So the split jobs are getting larger and larger. But it is the cheapest solution. Just needs the Basic and the SND software module.

 

B. The second solution

Is speed and data stream optimized and uses the same pooling mechanism of the destination queue as first example above (printers need to have the same printing speed):

[Global]

ELP=ON

Preparsing=ON

; Note: the data stream receiving queue should be connected to the default printer

; where all jobs below 100 pages are sent to

Max_ReadBuffer=16384

[Initialize the variables]

; Unfortunately the counter key is interpreted before the variable key

; so this rule moves the setting in front of the counter of next rule

Trigger_Binary=1

; This rule is always true! So set the variables

Variable=#SPLITAFTERPAGE1#:#PREPARSEPAGECOUNT#

Variable=#SPLITAFTERPAGE2#:#PREPARSEPAGECOUNT#

Variable=#SPLITAFTERPAGE3#:0

[If more then 100 pages split to 4 different printers]

Trigger_Binary=1

Trigger_Variable=#PREPARSEPAGECOUNT#>70

NoPrinting=ON

; Do not print this stream

OutPort=\\#HOSTNAME#\ELPin

; Split the job to the pooling queue (4 printers)

OutPortMode_CollectFonts=ON

; this key assures that all jobs are printable on their own

Counter=#SPLITAFTERPAGE1#;/4

; First page is spitted after 25% of total page size

Counter=#SPLITAFTERPAGE2#;/2

; After 50%

Counter=#SPLITAFTERPAGE3#;+#SPLITAFTERPAGE2#+#SPLITAFTERPAGE1#

; and after 75%

ELP_Command=C1:#SPLITAFTERPAGE1#F25997;C1:#SPLITAFTERPAGE2#F25997;C1:#SPLITAFTERPAGE3#F25997;

; Use the Forms-management command to add after those pages the file split command

; 3 splits result in 4 print files

Note:There are more possibilities for splitting data steams for Workload Balancing reasons:

a) Split in fixed print file size / page counters . Search in the manual the those 2 keys: Distribute_file size or Distribute_page count
b) It is also possible to split the job into archive files. Then a batch file (executed via call) might send the parts to the correct printer / printer queue.
c) If you wish to define a cover sheet on every newly generated job use the key PortCoverSheet=#### (#### is the macro number). The key provides also a possibility to set any additional escape sequences for example for paper in and output tray selection. Also the usage of any ELP variable is allowed in the initialization string.
The macro 22000 is available as a predefined cover sheet, but feel free to develop any own macro, using any predefined or any collected variables. Note: Using the ELP_Command EB#;does only print one cover sheet at the beginning of the print job! So it is NOT the same.

 

Related articles: Split Job To Staple, Distribute data streams