• Почему этот код ведет себя по-разному при множественных запусках?

    tumbler
    @tumbler
    бекенд-разработчик на python
    slice содержит внутри указатель, что приводит к гонкам при параллельной обработке слайса в разных горутинах
    Ответ написан
    4 комментария
  • Какая из баз данных лучше всего подходит для хранения большого словаря?

    @Miron11
    Пишу sql 20 лет. Срок :)
    А Вы не пробовали добавить индекс на поле из 4-х байтов?
    На MySQL индексы работают вполне приемлемо, главное, чтобы это был первый индекс созданный на таблице, тогда InnoDB ( default ) движок по умолчанию создаст кластеризованный индекс.
    Вот синтаксис: https://dev.mysql.com/doc/refman/8.0/en/create-ind...
    обратите внимание на варианты UNIQUE, это поможет подтвердить, что ключ каждого текстового поля действительно уникальный.
    Потом, во время запроса, надо будет аккуратно проверить синтаксис, чтобы подтвердить что запрос создан так, что индекс будет использован - тип данных в WHERE должен соответствовать, и что запрос действительно его использует ( по моему в MySQL это опция EXPLAIN ).
    Если все сделано верно, то скорость выполнения запроса с миллиардом записей должна быть вполне приемлема.
    Осталось проверить некоторые детали. Из вопроса не очень понятно, если база многопользовательская, или обслуживает пользователя работающего на этой же машине, есть ли одновременный доступ нескольких пользователей, иными словами доп информация по масштабу использования базы может помочь. И хотя SQLite намекает на чисто локальный характер записей, это детали которые лучше подтвердить, чем оставить за кадром.
    Кроме того, какой характер ключа из 4 байтов, это число или бинарная конструкция, если бинарная, приемлемо ли его перевести к типу Integer, это существенно для скорости индекса.
    ---
    Если же индекс уже создан, и не показывает результаты, которые Вы ожидаете, детали запрошенные выше помогут разобраться.
    Ответ написан
    Комментировать
  • Как записывать stdout в буфер и считывать оттуда построчно?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Вы всё верно понимаете, горутину можно не использовать.

    Вы можете сделать что-то типа такого
    работающий вариант

    package main
    
    import (
        "bufio"
        "bytes"
        "fmt"
        "io"
        "log"
        "os/exec"
    )
    
    type Executor struct {
        wr io.Writer
    }
    
    func (e *Executor) SetStdout(w io.Writer) {
        e.wr = w
    }
    
    func (e *Executor) Exec() error {
        cmd := exec.Command("ls", "/etc")
        cmd.Stdout = e.wr
        err := cmd.Run()
        return err
    }
    
    type BufferedBrokerWriter struct {
        buffer  bytes.Buffer
        scanner *bufio.Scanner
    }
    
    func NewBufferedBrokerWriter() *BufferedBrokerWriter {
        bw := &BufferedBrokerWriter{}
        bw.scanner = bufio.NewScanner(&bw.buffer)
        return bw
    }
    
    func (bw *BufferedBrokerWriter) Write(p []byte) (int, error) {
        return bw.buffer.Write(p)
    }
    
    func (bw *BufferedBrokerWriter) ReadLines(cnt uint) ([]string, error) {
        lines := make([]string, 0, cnt)
        linesCnt := uint(0)
    
        for bw.scanner.Scan() {
            line := bw.scanner.Text()
            err := bw.scanner.Err()
            if err != nil || line == `` {
                return lines, err
            }
    
            lines = append(lines, line)
            linesCnt++
            if linesCnt >= cnt {
                return lines, nil
            }
        }
    
        return nil, io.EOF
    }
    
    func main() {
        // подключаетесь к вашему брокеру сообщений,
    
        bw := NewBufferedBrokerWriter()
    
        e := &Executor{}
        e.SetStdout(bw)
    
        err := e.Exec()
        if err != nil {
            log.Fatal(err)
        }
    
        for {
            lines, err := bw.ReadLines(2)
            if err == io.EOF {
                break
            }
            fmt.Printf("Lines:\n%+v\n\n", lines)
        }
    }


    если возникнут сложности с реализацией - напишите, помогу
    Ответ написан
  • Почему не отрабатываются запросы net/http или как увеличить listen queue?

    @rustler2000
    погромист сикраш
    Потому что race condition.
    Используй ```atomic.AddUint64(&cnt, 1)```

    И да - необработанные запросы по стате ab смотреть надо.
    Ответ написан
    Комментировать
  • Стоит ли начинать учить Kotlin?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Профессионал знает много языков, а несколько углубленно.
    Выбирать один стоит тогда, когда вы хотя бы джуниор в 2-3
    Ответ написан
    Комментировать