Posts: 25
Threads: 10
Joined: Aug 2022
Reputation:
1
04-22-2025, 04:34 AM
(This post was last modified: 04-22-2025, 04:35 AM by Circlotron.)
I am trying to work with a text file of pi that is one single line of one *billion* digits. QB64 Phoenix doesn't seem to like putting this one long line into a string variable. It just sits there with one CPU maxed out. Maybe it might do something eventually, but not in any reasonable time frame.
Is there an easy way using Linux to convert this long line into a file in the following format?
3
.
1
4
1
5
9
etc?
That should make it much easier to deal with.
While we are at it, what is the maximum size file that can be opened for reading?
Posts: 273
Threads: 2
Joined: Apr 2022
Reputation:
58
I wouldn't bother trying to put this into a `STRING`, QB64 simply does not handle `STRING`s of that size very well (or at all, in some cases). There are ways you can make it happen but you won't be able to do anything non-trivial with it as most `STRING` operations result in the `STRING` getting copied, which is a big problem if it's a 1GB string.
A better idea is to create a 1GB `_MEM` and handle the data that way. Doing anything with the `_MEM` after you read the data is of course trickier than using a `STRING`, but ultimately you were never going to be able to use the regular `STRING` functions anyway.
Alternatively you could consider whether you actually need the whole thing in memory at one time. If you can adapt what you're doing to act on chunks of Pi at a time then you can process it without ever needing a 1GB `STRING`.
Posts: 243
Threads: 15
Joined: Apr 2024
Reputation:
30
DIM I AS _UNSIGNED _INT64
PIARRAY(0) = 3
FOR I = 2 TO NUMBYTES - 1
PIARRAY(I) = PIARRAY(I) - 48
NEXT
That converts each byte ASCII value to it's numeric value.
Posts: 25
Threads: 10
Joined: Aug 2022
Reputation:
1
Okay, thanks for all that. Not really familiar with arrays, so about to learn as I go.
Posts: 176
Threads: 15
Joined: Apr 2022
Reputation:
25
It depends what/how you want to process this? What is your usecase?
In general the initial format you have is a lot more powerfull then what you suggest (put crlf between all characters)
QB64 can handle this easily and depending on your scenario, you could put it in a _MEM (unlimited) or fixed length string (up to 2GB) or process it by reading blocks of 64Mb (which I do with 100GB+ files)
45y and 2M lines of MBASIC>BASICA>QBASIC>QBX>QB64 experience
Posts: 25
Threads: 10
Joined: Aug 2022
Reputation:
1
That _READFILE function is fabulous! I've never used it before. I'm reading in the single line, running through it with a FOR-NEXT loop around MID$ and looking for sequences that match the decimal place position. e.g. at position 16,470 there is the sequence 16470. There are several like that. Haven't quite got it working just yet.
I'll have a look at the _MEM thing too.