in reply to Re: index first 24 bytes of every line in file
in thread index first 24 bits of every line in file
I think he said he was going to save the first 24 bits (3 characters). Which may mean we're not looking at the same version of his post...
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: index first 24 bytes of every line in file
by BrowserUk (Patriarch) on Feb 26, 2008 at 15:31 UTC | |
Look again at the title of this post, oryour post, or mine to which you replied. Or any of the posts posted before he realised his mistake and corrected both the title and content of the OP. Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
by mhearse (Chaplain) on Feb 27, 2008 at 00:50 UTC | |
Or the same using store/retrieve to avoid the repeated parsing: Last night I wrote a script which creates an index of the first three bytes, then saves it using Storable. The following program uses the index to print out the byte offset of ONLY AN EXACT MATCH: I'd like to be able to handle more conditions. Say the user enters only the letter M. I would like to print out the first 25 matches that start with M. Or if they enter MV, the first 25 matches that start with MV. The max input lenght is 3 characters. My assumption (probably erroneous) is that I need three byte offset indexes to handle my requirements. Is there another programatic approach, besides DBI, or iterating over the entire list of keys and doing a contains/starts with search? I'm just looking for ideas. Any input is appreciated. | [reply] [d/l] [select] |
by BrowserUk (Patriarch) on Feb 27, 2008 at 02:18 UTC | |
My assumption (probably erroneous) is that I need three byte offset indexes to handle my requirements. I don't get what your getting here. In a 500 MB file, you will require 29-bits (2**29 == 512 MB) offsets to index the lines in the file, regardless of the length of the keys. Ie. You will need a full 32-bit integer to store those offsets. If your files are ever likely to get bigger than 4GB, you would need to move to using doubles--so 8 bytes per offset. The number of characters you select from the start of your lines to form the key will not affect the offset sizes. Now the keys. You say you only need 3 characters. And in all your examples, you use only upper case letters. As I pointed out above, there are only 17,576 combinations, so unless your lines are very, very long, you must be expecting duplicate lines with the same first 3 characters? If that is the case, and the file is sorted as you said above, then you only need build an index of the up to 17,576 starting points for groups of records that share the same first characters as you would have no way to select more closely than that. Now the requirements. You say you'd like to return the first 25 matches of a partial input. Then in a 500MB file, assuming say 50-char lines (as suggested above) then you will have circa. 600 lines starting with 'AAA'. Say the input was 'AA'. The first (sorted ordered) 25 entries will (on average) all start with 'AAA'. Say the input was just 'A'. Again, the first 25 will all start with 'AAA'. Now perhaps what you mean is that if the input is just 'A', you want to display the first one that starts 'AA', and the first that starts 'AB' ... the first that starts 'AX'? And if the input is 'AA', then the first that starts 'AAA', the first that starts 'AAB', ... the first that starts 'AAX'? (Assuming there are actually lines in the file matching those.) If so, then you needn't index any more lines, because you can achieve that with just the 17,576 entry index and a little code:
I'm not at all sure any of this is helpful because it is still very unclear what you are trying to achieve. Maybe a few sample lines of the data file with a couple of examples of inputs and outputs would clarify. Finally, an explanation of why you are avoiding using a DB? If there is any concurrency involved, eg. a web app that maybe used by more than one user at a time; or if the data file is relatively unchanging, then a DB is far simpler. Maybe not the quickest, but certainly the easiest. Once again, without a clearer idea of what you are trying to achieve, it's hard to be more specific. Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] |