Comments (11)
For reference, I've tried converting to bytes like this, but I get a panic: runtime error: slice bounds out of range
at some point in the loop:
func stringToBytes(s *string) []byte {
return *(*[]byte)(unsafe.Pointer(s))
}
from buntdb.
I think only solution is fork or make PR with some changes to work buntdb with slice of bytes than raw strings. Cause internally it use anyway bytes as u can see here https://github.com/tidwall/buntdb/blob/master/buntdb.go#L1218
from buntdb.
Oh yeah - you're right. I wonder what the motivation behind having string
in the api was. Presumably that was for a good reason.
from buntdb.
I wonder what the motivation behind having string in the api was. Presumably that was for a good reason.
Strings are used instead of bytes because the database is in-memory and strings avoids any chance of accidental mutations to the base values. For example, with []byte values, it could be possible to call val := tx.Get("mykey")
and then change the byte at some arbitrary position and break the ordering of the indexing.
This is less of an issue with on-disk databases because Get
operations commonly retrieve from disk and load into memory for a short period of time. Changes to the memory would likely not corrupt the value in that persists on disk.
Your stringToBytes is casting types of two different sizes. string is 2 words and []bytes is 3 words. This may work better:
func stringToBytes(s string) []byte {
return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
(*reflect.StringHeader)(unsafe.Pointer(&s)).Data,
len(s), len(s),
}))
}
from buntdb.
Thanks so much. Could I be cheeky and ask for the correct function for the inverse operation - this is a little too low level for me!!
from buntdb.
Just swap out the StringHeader/SliceHeader and string/[]byte. Also a StringHeader takes 2 words which is the Data and Len fields, while the SliceHeader has Data, Len, and Cap.
func bytesToString(b []byte) string {
return *(*string)(unsafe.Pointer(&reflect.StringHeader{
(*reflect.SliceHeader)(unsafe.Pointer(&b)).Data, len(b),
}))
}
from buntdb.
Superb - looking forward to plugging this improved conversion into the benchmarks. I bet it will improve the iteration speed massively.
from buntdb.
Hello,
@jpincas you have a best result with the stringToBytes
?
from buntdb.
Actually it didn't seem to make a whole lot of difference. I think it might be the case that Go optimises this under the hood.
from buntdb.
Ok interesting, thank you for your reply š
from buntdb.
Iām closing this issue for now. Feel free to reopen if you find a specific issue that needs addressing. Thanks.
from buntdb.
Related Issues (20)
- Python bindings
- Enhancement: add new method GetWithTTL to return value together with TTL
- What happens if two funcs write to the db at the exact same time? HOT 1
- Get size of db on disk
- Does the data.db file support rewrite like redis AOF? HOT 2
- Dependencies update due?
- Feature Request: Delete inside iterator
- Question: cost/benefit of supporting generic types; and persisting secondary indexes
- Is it necessary to (defer) db.Close()?
- Expiry works only during runtime and is lost on shrink HOT 6
- Feat: Add DescendGreaterOrEqual for the range [last, pivot], and also DescendRange with option (lt, gte]
- Support replication?
- Java Support?
- Question: What is the format of .db file? HOT 1
- I wonder if we can find closest lat long for a given latlon from spatial index using nearby
- [Feature Request] Is there a way to limit memroy usage?
- Is there any plan to support index on MessagePack? HOT 1
- How to renew the ttl?
- Question: Is buntdb goroutine-safe? HOT 1
- Will "group by" be supported in this lib?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
š Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ššš
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ā¤ļø Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from buntdb.