После тестирования данного кода я считаю, что ваша проблема может заключаться в том, как вы инициализируете файл.Я предполагаю, что в коде, который работает, вы использовали какой-то вариант
`:D:/q4m/L set til 5
ранее.Однако это не делается для
`:D:/q4m/raw
Если вы должны были использовать
`:D:/q4m/raw set til 5
или альтернативно
.[`:D:/q4m/raw;();:;()]
заранее, тогда будет работать первый набор кода.
Кроме того, если мы посмотрим на двоичный файл, используя
read1 `:D:/q4m/raw
и
read1 `:D:/q4m/L
, и вывод не включает 07 в начале, то он не распознаетсякак правильный список KDB.То есть, hopen просто добавляет в двоичный файл, а не вносит в него изменения.(Если вы заметили, что байт 05 указывает длину списка, он не увеличивается при добавлении через дескриптор).например.Первый метод, который вы получите
q)read1 `:D:/q4m/raw
0x2a000000000000000a0000000000000014000000000000001e00000000000000
, который на самом деле ничего не значит в q.Второй метод дает
q)read1 `:D:/q4m/L
0xfe2007000000000005000000000000000000000000000000010000000000000002000000000..
, который является правильным списком kdb (обратите внимание на 07, который указывает тип).
Если вы хотите вместо этого просто прочитать в / q4m / raw, тогда я предлагаю установитьпустой список, перейдите к этому списку и передайте его `: D: / q4m / raw следующим образом
q)`:empty set 0#0
`:empty
q)h:hopen `:empty
q)h read1 `:D:/q4m/raw
3i
q)get `:empty
42 10 20 30
Это будет работать, только если все записи одного типа.