fractal 2048 belt balancer (and bigger?)

Circuit-free solutions of basic factory-design to achieve optimal item-throughput.
Involving: Belts (balancers, crossings), Inserters, Chests, Furnaces, Assembling Devices ...
Optimized production chains. Compact design.
Please provide blueprints!
Forum rules
Circuit-free solutions of basic factory-design to achieve optimal item-throughput
Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 512 belt balancer

Post by Qon »

JohnyDL wrote:
JohnyDL wrote:So you then need to do a little more for full throughput, I worked out a maximum bound for the full throughput but not a formula for the perfect number, I'm guessing it's only another half as many splitters as you have rows, but I can't be certain of that as seemingly any layout I pick for redistributing the lanes to that last set of splitters in my head I can think of a set of lanes input and the outputs to match that it wouldn't provide full throughput. That's not to say it couldn't be done just to say I can't visualise and test things on this scale without my computer and factorio in front of me and while that would give you a minimum bound for full throughput balances of size 2^n, n>2 I'm not sure it works perfectly. These are the ranges I get for full throughput balancers.

4:6-6, 8:16-20, 16:40-56, 32:96-144, 64:224-352, 128:512-832, 256:1152-1920, 512:2560-4352, 1024:5632-9728

As I recall the best I've managed for my 16 to 16 is 48 splitters giving me full throughput, 288 for the 64 to 64, 1.5k for the 256 to 256. Which might mean the answer is in the middle of the range or that there are better solutions I haven't found or something else. I don't know.
I got the 16:48, 64:288: and 256:1536 to work by taking advantage of their square numbers

(4*4to4)to(4*4to4)to(4*4to4), (8*8to8)to(8*8to8)to(8*8to8) and (16*16to16)to(16*16to16)to(16*16to16), basically allowing the full throughput by allowing N unique paths from each of the input N to N balancers to each of the outputs... I then thought maybe I could do a 32 to 32 by (8*4to4)to(4*8to8)to(8*4to4) should do the same leverage right, well taking it one or 2 steps forward I realised your fractal has done the hard work for me

the way your balancer does it's conversion from (2 * N to N) to (N * 2 to 2), that's how you leverage it into full throughput, but you don't tag it onto the same end again no the genius bit is tagging it onto the other end for full through put with the smallest number of splitters, in effect you get the exploit I was using to get throughput with fewer splitters pushed to it's limit. Not (N to N) to (N to N) sharing a few splitters which is the common way of guaranteeing full throughput while trying to use a few less splitters. No, instead you do (N * 2 to 2) to (2 * N to N) to (N * 2 to 2) Now it doesn't matter if you use the fractal N to N in the middle though I'm betting you will or some alternative (as I might), so long as it's one of the count perfect balancers with 1, 4, 12, 32, 80 etc splitters it will work. And you end up hitting that minimum sequence of splitters required for full throughput

4:2*1+4=6, 8:2*4+8=16, 16:2*12+16=40, 32:96, 64:224, 128:512, 256:1152, 512:2560, 1024:5632

I haven't practically tested it or used d4rkc0d3r's balancer program yet (I will) but the logic holds each splitter input has 2 distinct routes to each output splitter and any input pair and output pair also have distinct routes. In my head I can extend this to any equal number of lanes whether they share splitters or not as half a lane would go to one of the N to N and the other to the other and could meet back up at the other side at any point, exchanging part of one route with part of another doesn't effect the throughput and 2 half lanes can easily share the same lane without adding bottle necks. Do you agree with me on this logic?
I don't really understand the semantics of 4:6-6, (8*8to8)to(8*8to8)to(8*8to8), (2 * N to N) to (N * 2 to 2), 4:2*1+4=6 and similar. It's not explained anywhere and it doesn't look like what's in your paper either.
When making a new language you kinda have to teach it to others before speaking it if you want to be understood ;) .
N:M means N-Balancer (N inputs and outputs) with M splitters?
(8*8to8)to(8*8to8)to(8*8to8) is... what? Do you have three 64-to-8 balancers chained after another?

JohnyDL
Filter Inserter
Filter Inserter
Posts: 533
Joined: Fri May 16, 2014 3:44 pm
Contact:

Re: fractal 512 belt balancer

Post by JohnyDL »

Qon wrote:I don't really understand the semantics of 4:6-6, (8*8to8)to(8*8to8)to(8*8to8), (2 * N to N) to (N * 2 to 2), 4:2*1+4=6 and similar. It's not explained anywhere and it doesn't look like what's in your paper either.
When making a new language you kinda have to teach it to others before speaking it if you want to be understood ;) .
N:M means N-Balancer (N inputs and outputs) with M splitters?
(8*8to8)to(8*8to8)to(8*8to8) is... what? Do you have three 64-to-8 balancers chained after another?
Right yeah I thought it was more obvious than it was given context and coming up with new notation I tend to go it then have to re read it a day later and figure out what was going on *i.e. I suck*

N:M is an N lane balancer with M splitters
N:M-O is an N lane balancer with what I'd considered the minimum, M, and maximum, O, number of splitters required for full through put
N:MATH is a N lane balancer with the math I followed to get the answer -> explained later
(A*B to B) is A groups of B to B balancers in a line
(A*B to B) to (B*A to A) is A groups of B to B balancers feeding one line from each into B groups of A to A balancers

So that would mean (8*8to8)to(8*8to8)to(8*8to8) is a 64 to 64 balancer with the structure balance 8 groups of 8 lanes so you have blocks a through h then balance one lane from a-h in each of the next set of 8 to 8s and then regroup the lines so all a's are together and so on balancing them in the final set
with the 16 to 16 or (4*4to4)to(4*4to4)to(4*4to4) in the other notation it looks like

Code: Select all

[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]
[1,5,9,13][2,6,10,14][3,7,11,15][4,8,12,16]
[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]
OR
[1,2,3,4>a,a,a,a][5,6,7,8>b,b,b,b][9,10,11,12>c,c,c,c][13,14,15,16>d,d,d,d]
[a,b,c,d>w,w,w,w,][a,b,c,d>x,x,x,x][a,b,c,d>y,y,y,y][a,b,c,d>z,z,z,z]
[w,x,y,z][w,x,y,z][w,x,y,z][w,x,y,z]
But I thought explaining that notation would have been jarring, but since it's here I should explain [a,b,c,d] is simply balance those 4 lanes and the > is used to rename them
(N * 2 to 2) to (2 * N to N) to (N * 2 to 2) is a 2N to 2N balancer, where you balance N groups of 2 lanes shuffle them out into 2 N to N balancers and then reshuffle out into N 2 to 2s.
or in the other coding

Code: Select all

[1,2][3,4][5,6][7,8]....
[1,3,5,7....][2,4,6,8....]
[1,2][3,4][5,6][7,8]....
This gives the logic for the math N:2*f(N-1)+N=number of splitters for full through put and F(n) being splitters for half through put

You need 2 of the half balancers and the N balancers for the 2*(n*2 to 2)s so for the 4 that's 2* 1 (the number for the 2 to 2) + 4 = 6 for full though put (which we know is the hour glass balancer) for the 8 to 8 thats 2* 4 (the 4 to 4 half throughput) +8 = 16, the 16: 2*12+16 = 40 etc..

Does this clear it up or have I missed anything?



EDIT: now at PC and testing and gah I'm not sure it works anyway.... damn I shouldn't have been writing stream of consciousness, sorry guys I'm now going back and checking my 16 to 16 :/

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 512 belt balancer

Post by Qon »

JohnyDL wrote: I think when I get my PC back and I can do some image editing and show off what I mean it will all make sense until then this is the solution to full throughput

Code: Select all

                               /\                               
                              /  \                              
                             /    \                             
                            /      \                            
                           /        \                           
                          /          \                          
                         /            \                         
                        /              \                        
                       /                \                       
                      /                  \                      
                     /                    \                     
                    /                      \                    
                   /                        \                   
                  /                          \                  
                 /                            \                 
                /                              \                
               /                                \               
              /                                  \              
             /                                    \             
            /                                      \            
           /                                        \           
          /                                          \          
         /                                            \         
        /                                              \        
       /                                                \       
      /                                                  \      
     /                                                    \     
    /                                                      \    
   /                                                        \   
  /                                                          \  
 /                                                            \ 
/                                                              \
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
 /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\ 
/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \
   /\      /\      /\      /\      /\      /\      /\      /\   
  /  \    /  \    /  \    /  \    /  \    /  \    /  \    /  \  
 /    \  /    \  /    \  /    \  /    \  /    \  /    \  /    \ 
/      \/      \/      \/      \/      \/      \/      \/      \
       /\              /\              /\              /\       
      /  \            /  \            /  \            /  \      
     /    \          /    \          /    \          /    \     
    /      \        /      \        /      \        /      \    
   /        \      /        \      /        \      /        \   
  /          \    /          \    /          \    /          \  
 /            \  /            \  /            \  /            \ 
/              \/              \/              \/              \
               /\                              /\               
              /  \                            /  \              
             /    \                          /    \             
            /      \                        /      \            
           /        \                      /        \           
          /          \                    /          \          
         /            \                  /            \         
        /              \                /              \        
       /                \              /                \       
      /                  \            /                  \      
     /                    \          /                    \     
    /                      \        /                      \    
   /                        \      /                        \   
  /                          \    /                          \  
 /                            \  /                            \ 
/                              \/                              \
                               /\                               
                              /  \                              
                             /    \                             
                            /      \                            
                           /        \                           
                          /          \                          
                         /            \                         
                        /              \                        
                       /                \                       
                      /                  \                      
                     /                    \                     
                    /                      \                    
                   /                        \                   
                  /                          \                  
                 /                            \                 
                /                              \                
               /                                \               
              /                                  \              
             /                                    \             
            /                                      \            
           /                                        \           
          /                                          \          
         /                                            \         
        /                                              \        
       /                                                \       
      /                                                  \      
     /                                                    \     
    /                                                      \    
   /                                                        \   
  /                                                          \  
 /                                                            \ 
/                                                              \
You can build it yourself if you want. Just cut and paste some parts from:
*Tries to paste a 128-balancer*
Your message contains 100929 characters. The maximum number of allowed characters is 60000
Ok lets go with a 64-balancer:

Code: Select all

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
Just take the end and put it in front. And then you can run the analysis program on it and stuff and verify if you get full throughput.
And you can swap around the sections if you prefer the look of the big arrow first.

I'll release the 2048-balancer and the code soon I guess. I've been trying to improve the code though and hoping for even bigger balancers in the future. But I'm creating more bugs than balancers so far :|

JohnyDL
Filter Inserter
Filter Inserter
Posts: 533
Joined: Fri May 16, 2014 3:44 pm
Contact:

Re: fractal 512 belt balancer

Post by JohnyDL »

Yeah it didn't work
trying to improve the 64 to 64.PNG
trying to improve the 64 to 64.PNG (8.03 KiB) Viewed 66145 times
I've been running what I'd been considering full throughput through the ringer too you know the ones I said were (4 * 4 to 4) to.... they're good I mean it takes really obscure loads to get them to be noticeably under 95% but when it comes down to it they're all 75% throughput not 100 % which is kind of taken the wind out of my sail a bit. That said they behave differently starting loaded up with items compared to empty which just adds to my confusion. Also my 8 to 8 could save you a few extra belts unless you're committed (yours left mine middle and right)
8 to 8s.PNG
8 to 8s.PNG (389.28 KiB) Viewed 66145 times
Oh and with that your 64 to 64 under the version I tweaked slightly
screenshot2.png
screenshot2.png (11.8 MiB) Viewed 66138 times

JohnyDL
Filter Inserter
Filter Inserter
Posts: 533
Joined: Fri May 16, 2014 3:44 pm
Contact:

Re: fractal 512 belt balancer

Post by JohnyDL »

Oh I did also go bigger to get that fractally look I made with the code tags
512 Fractally.PNG
512 Fractally.PNG (97.02 KiB) Viewed 66137 times

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 512 belt balancer

Post by Qon »

JohnyDL wrote:Oh I did also go bigger to get that fractally look I made with the code tags
You could have just asked for a bigger BP string if you wanted one :o

Though the new design is fairly easy to build on compared to my old one. Everything has a regular shape. But you also removed some extra UG belts too? I'm qonsidering doing that in the generator code too, but the priority has been larger balancers for a while now.

But it looks neat when all the diagonal lines line up. I'm qonvinced.

JohnyDL
Filter Inserter
Filter Inserter
Posts: 533
Joined: Fri May 16, 2014 3:44 pm
Contact:

Re: fractal 512 belt balancer

Post by JohnyDL »

Including all the land fill it took me about 30 minutes to scale up the design 8 fold so I think it's easy enough to increase in size to not need to bother you and I think it's now consistently 1.2 times longer than its width and doesn't quite double in length as it doubles in width though now I'm at the point I can't see what I'm lining up with and placing on the same screen

As for undergrounds they could still be slimmed down I think the ones that go across the balancers flow have a 6 gap not 8 in the 512 and the solution door the 16 to 16 section wasn't particularly difficult for me to shorten

Oleksij
Burner Inserter
Burner Inserter
Posts: 5
Joined: Wed Apr 26, 2017 11:56 am
Contact:

Re: fractal 512 belt balancer

Post by Oleksij »

This is exactly what I need!

Any chance to have 128 and 256 ones in new blueprint format?

I have 127 belts of iron ore already, for 2.4k spm bus.

I'm also thinking about building a 4.8k spm one. 256 will be perfect to have there. Just for the sake of insanity. And to reduce the number of unload train stations :)

https://www.reddit.com/r/factorio/comme ... xperiment/

orzelek
Smart Inserter
Smart Inserter
Posts: 3911
Joined: Fri Apr 03, 2015 10:20 am
Contact:

Re: fractal 512 belt balancer

Post by orzelek »

It looks like you should move to stacking items on belts with mod to get back lots of performance :)

Radixx
Manual Inserter
Manual Inserter
Posts: 3
Joined: Tue Feb 13, 2018 2:48 am
Contact:

Re: fractal 512 belt balancer

Post by Radixx »

I wish I had joined this discussion earlier. I did quite a bit of thinking about this when I tried to make my own full throughput 16-16 balancer. I probably won't be able to explain my thinking very well, but I'll give it a shot.

My conclusions were based on the definition of a full throughput N:N balancer as one in which you can supply with any combinations of n (n<=N) fully saturated inputs inputs, and be able to pull any combination of n fully saturated outputs. Roughly speaking, this means that any input line should have N entirely unique paths from input to output.I believe this can be shown with proof by contradiction:

Say there is an N:N balancer, and for at least one lane (lane i), there are only m (m < N) distinctly unique paths from the input to one of the outputs. Now if we feed m saturated belts (not using lane i) in a manner that fully saturates the m unique paths for lane i, then there is no more room to add another saturated belt.

My logic above doesn't seem sound, but I'm not sure how to demonstrate it yet. I still believe my conclusions to be true.

For this 8:8 balancer posted by JohnyDL:

Image

There is only a single lane which can take items from inputs 1/2 (bottom) to outputs 7/8 (top). If you were to provide two fully saturated inputs in lanes 1 and 2, you could not pull two fully saturated lanes from outputs 7 and 8 (or any two lanes from 5 to 8 for that matter) because there is only a single path from lanes 1/2 to any of the 4 rightmost outputs.

One way to describe the solution is to start with N inputs, and evenly balance each lane into N/2 splitters (image above), then to have each of the output lanes evenly draw from each of those intermediate splitters. With the 8:8 balancer above, this could be done by adding a second 8:8 balancer direcly after it, and optimized by remove the repeated double row of 4 splitters in the middle, leaving 20 splitters total.

Minimum full throughput splitter count:

For a 2^N:2^N balancer, it requires 2*N-1 rows of 2^(N-1) splitters. This would require the following splitter counts for each balancer:

# lanes | N | 2*N-1 | 2^(N-1) | total
2:2 1 1 1 1
4:4 2 3 2 6
8:8 3 5 4 20
16:16 4 7 8 56
32:32 5 9 16 144
64:64 6 11 32 352
128:128 7 13 64 832
256:256 8 15 128 1920
512:512 9 17 256 4352

As a final note, I'll leave my version of what I believe to be a full throughput 16:16 balancer:

Image

Code: Select all

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

d4rkpl4y3r
Long Handed Inserter
Long Handed Inserter
Posts: 66
Joined: Wed Apr 27, 2016 8:24 pm
Contact:

Re: fractal 512 belt balancer

Post by d4rkpl4y3r »

Radixx, your balancer is not a throughput unlimited balancer:

Code: Select all

Loading a 16 to 16 balancer with dimensions 16x33 and 56 splitters
Longest underground belt distance is 7 tiles
Output balance: 16/16
Input balance: 16/16
Throughput under full load: 100%
Min Throughput with all combinations: 50%
However you can simply use two balancers (here this one) in a row to make a throughput unlimited one:
image

Code: Select all

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

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 512 belt balancer

Post by Qon »

Oleksij wrote:This is exactly what I need!

Any chance to have 128 and 256 ones in new blueprint format?

I have 127 belts of iron ore already, for 2.4k spm bus.

I'm also thinking about building a 4.8k spm one. 256 will be perfect to have there. Just for the sake of insanity. And to reduce the number of unload train stations :)

https://www.reddit.com/r/factorio/comme ... xperiment/

Code: Select all

C:\QDocs\Dropbox\Qode\factoriomods>node --max_old_space_size=65536 .\balancer.js 4096
C:\QDocs\Dropbox\Qode\factoriomods/8_balancer.txt     size:        8x10 stringsize:        945 generation time:      0 encode time: 0
C:\QDocs\Dropbox\Qode\factoriomods/16_balancer.txt    size:       16x24 stringsize:       3081 generation time:   0.01 encode time: 0
C:\QDocs\Dropbox\Qode\factoriomods/32_balancer.txt    size:       32x48 stringsize:       9913 generation time:   0.04 encode time: 0
C:\QDocs\Dropbox\Qode\factoriomods/64_balancer.txt    size:       64x92 stringsize:      30693 generation time:   0.11 encode time: 0.02
C:\QDocs\Dropbox\Qode\factoriomods/128_balancer.txt   size:     128x176 stringsize:      94453 generation time:   0.33 encode time: 0.06
C:\QDocs\Dropbox\Qode\factoriomods/256_balancer.txt   size:     256x340 stringsize:     299821 generation time:      1 encode time: 0.26
C:\QDocs\Dropbox\Qode\factoriomods/512_balancer.txt   size:     512x664 stringsize:     989361 generation time:   3.72 encode time: 0.76
C:\QDocs\Dropbox\Qode\factoriomods/1024_balancer.txt  size:   1024x1308 stringsize:    3475101 generation time:  12.94 encode time: 2.98
C:\QDocs\Dropbox\Qode\factoriomods/2048_balancer.txt  size:   2048x2592 stringsize:   12817777 generation time:   51.5 encode time: 12.63
Here's all sizes up to 2048 in the new format. Need moar RAM to generate bigger ones. Also includes the code! I didn't clean it up or check anything. Just ran and uploaded...

Please make some bigger ones if you have the RAM and time :D
Attachments
2048_balancer + code.zip
(7.17 MiB) Downloaded 2658 times

Oleksij
Burner Inserter
Burner Inserter
Posts: 5
Joined: Wed Apr 26, 2017 11:56 am
Contact:

Re: fractal 512 belt balancer

Post by Oleksij »

Thanks mate, much appreciated. I think I will find a good use for either 128 or 256 one.

This is how 128 and 256 ones look near my 4.8k spm bus: https://cl.ly/1R3X2r3x042o

Right now under full load "transport lines" and "entity update" both take around 10ms, dropping the ups down to ~42. I can reduce the size of smelting array by some 10-15% and remove some extra balancing along the bus by adding a big balancer after smelting array. That way I will have direct belts from the balancer down to assembler arrays. I just wonder what's heavier for ups - a huge balancer or extra 15% of smelters. Need to test :)

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 512 belt balancer

Post by Qon »

So beautiful! Thanks for sharing. Looks like a big factory. How much does that produce/minute?

You can upload images with "upload attachment" to include them in your post next time. So the image stays permanently and can be viewed inside your post. If you didn't know.

Oleksij
Burner Inserter
Burner Inserter
Posts: 5
Joined: Wed Apr 26, 2017 11:56 am
Contact:

Re: fractal 512 belt balancer

Post by Oleksij »

4.8k spm. 2 blue belts worth of each science.

This was my previous one, 2.4k spm: https://www.reddit.com/r/factorio/comme ... xperiment/

Working on 4.8k. It's functional and stable, but bus itself drops ups down to 40. That's without train network and power. So, optimizing and rebuilding it right now. :)

deadly990
Manual Inserter
Manual Inserter
Posts: 2
Joined: Mon Sep 14, 2020 3:13 pm
Contact:

Re: fractal 2048 belt balancer (and bigger?)

Post by deadly990 »

I was able to generate a 4096 balancer, but the blueprint string is ~48 megs in size and is too large to upload to this forum.

Code: Select all

code/8_balancer.txt     size:        8x10 stringsize:        945 generation time:      0 encode time: 0
code/16_balancer.txt    size:       16x24 stringsize:       3081 generation time:      0 encode time: 0
code/32_balancer.txt    size:       32x48 stringsize:       9913 generation time:   0.03 encode time: 0
code/64_balancer.txt    size:       64x92 stringsize:      30693 generation time:   0.04 encode time: 0.01
code/128_balancer.txt   size:     128x176 stringsize:      94453 generation time:   0.12 encode time: 0.04
code/256_balancer.txt   size:     256x340 stringsize:     299821 generation time:   0.41 encode time: 0.14
code/512_balancer.txt   size:     512x664 stringsize:     989361 generation time:   1.46 encode time: 0.53
code/1024_balancer.txt  size:   1024x1308 stringsize:    3475097 generation time:   5.92 encode time: 1.95
code/2048_balancer.txt  size:   2048x2592 stringsize:   12817521 generation time:  27.15 encode time: 8.99
code/4096_balancer.txt  size:   4096x5156 stringsize:   49149653 generation time: 167.36 encode time: 55.88
It took only about 15 gigs of RAM. I'm going to run 8192 just to see.

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 2048 belt balancer (and bigger?)

Post by Qon »

deadly990 wrote:
Mon Sep 14, 2020 3:20 pm
I was able to generate a 4096 balancer, but the blueprint string is ~48 megs in size and is too large to upload to this forum.

It took only about 15 gigs of RAM. I'm going to run 8192 just to see.
Nice!

The 8192 balancer is probably going to double the memory requirements as well 8-)

I usually upload to https://zippyshare.com/ when the forum fails. The links don't expire and you can upload several hundred megabytes (I think up to 500MB). Also free, fast and doesn't have any popups or timers to wait for to download. So please share, for science!

I've considered rewriting the blueprint library to not require any memory by streaming all the data directly and not saving the partial work in any data structures. Or writing the code in Lua and make it a mod that builds the balancers incrementally in the game. The string is zipped and that most probably requires the entire string in memore and then some to actually compress it, so that could be what all the memory is used by? If so then streaming the blueprint entities entity by entity wouldn't help. But making it a mod would work then.

deadly990
Manual Inserter
Manual Inserter
Posts: 2
Joined: Mon Sep 14, 2020 3:13 pm
Contact:

Re: fractal 2048 belt balancer (and bigger?)

Post by deadly990 »

I'm fairly sure that you can stream into zlib compression.
I think you can also stream base64 encoding.
I'd have to do more research.

The program never terminated at 8192 size. It ramped up to about 23GB of ram usage, and then stayed there using about 5% of my CPU for a couple hours before I stopped it.

I re-added your memoization code (not the streaming ones) which seems to produce the same outcome with about a 25% speedup, and will run it overnight.

silenced
Inserter
Inserter
Posts: 39
Joined: Tue Jan 13, 2015 12:38 pm
Contact:

Re: fractal 2048 belt balancer (and bigger?)

Post by silenced »

What da fuq did I just read the last few pages? ôÔ

Anyways, keep up the good work, it's kind of amazing. But I'll stay with the small balancers. :geek:

Qon
Smart Inserter
Smart Inserter
Posts: 2091
Joined: Thu Mar 17, 2016 6:27 am
Contact:

Re: fractal 2048 belt balancer (and bigger?)

Post by Qon »

deadly990 wrote:
Tue Sep 15, 2020 3:14 am
I'm fairly sure that you can stream into zlib compression.
Ok, good. Then it should be possible to get a constant memory footprint :)
Or really memory use O(log n) on side length n. Which means it's about 0 even if the bp string is ExaBytes.
deadly990 wrote:
Tue Sep 15, 2020 3:14 am
I think you can also stream base64 encoding.
Definitely possble as long as it is right padded and not left padded with 0's. And since it's string b64 encoding I'm assuming the sane choice of right-padding is used.

Post Reply

Return to “Mechanical Throughput Magic (circuit-free)”