feat: Added parallel initialization to inmemory and hash servers
This commit is contained in:
@@ -2,7 +2,11 @@ package storage
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.nicholasnovak.io/nnovak/spatial-db/world"
|
||||
)
|
||||
@@ -16,3 +20,52 @@ func ReadChunkFromFile(chunkFile *os.File) (world.ChunkData, error) {
|
||||
|
||||
return chunkData, nil
|
||||
}
|
||||
|
||||
func ReadParallelFromDirectory(dirName string) ([]world.ChunkData, error) {
|
||||
chunkFiles, err := os.ReadDir(dirName)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Filter invalid chunks
|
||||
|
||||
validChunkFiles := []fs.DirEntry{}
|
||||
for _, chunkFile := range chunkFiles {
|
||||
if chunkFile.IsDir() || !strings.HasSuffix(chunkFile.Name(), ".chunk") {
|
||||
continue
|
||||
}
|
||||
validChunkFiles = append(validChunkFiles, chunkFile)
|
||||
}
|
||||
|
||||
chunks := make([]world.ChunkData, len(validChunkFiles))
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(len(validChunkFiles))
|
||||
|
||||
for fileIndex, chunkFile := range validChunkFiles {
|
||||
// Avoid implicit copies
|
||||
chunkFile := chunkFile
|
||||
fileIndex := fileIndex
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
file, err := os.Open(filepath.Join(dirName, chunkFile.Name()))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
chunkData, err := ReadChunkFromFile(file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
file.Close()
|
||||
|
||||
chunks[fileIndex] = chunkData
|
||||
}()
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
|
||||
return chunks, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user