Нужно написать потоковый декодер, который будет парсить файл, отфильтровать объекты, где scores > 0.7, и затем записать эти объекты в файл рядом (тоже потоково). Загружать весь файл полностью и распаковывать в массив нельзя. Изменять структуру файла из задачи нельзя. Выходной формат тоже JSON. Итоговая сортировка не важна. Язык не важен.
onep
Не уверен, что решение правильное. Просто, топ поддержать )
start = time.time() with open('task-1.json') as data: f = json.load(data) print(len(f)) with open('task-1.json') as data: content = data.read() row = json.loads(content) with open('res-task-1.json', 'w') as f: f.write('[')
for item in row: if item.get('scores') >= 0.7: f.write(json.dumps(item)) f.write(',') f.write(']') print(time.time()-start)
две строки тут лишние — толкь для подсчета времени
в среднем выполняется за 0.03 сек на core i5 quad
было 10000 строк стало 2995
timo-71
Sly32: content = data.read()
В задаче запрещено грузить весь файл
danforth: Загружать весь файл полностью и распаковывать в массив нельзя.
ziliboba0213
Задал бы я вам квест, да не хочу палиться 🤪 Но там чисто алгоритм, но до сих пор сложить его не могу, умишком слаб :p
Sly32
timo-71: В задаче запрещено грузить весь файл
да, неправильно в таком случае мое решение
danforth
Sly32, на выходе не валидный json 🙂 Да и вычитано у тебя все в память.
Мое решение на Go, как обычно — самое длинное https://play.golang.org/p/gWg-gqR-Xvi
file filtered successfully, took 22.997923ms
Sly32
danforth: Sly32, на выходе не валидный json Да и вычитано у тебя все в память.
Да, вижу, но пока не нашел красивого решения. не нравиться мне идея читать посимвольно файл руками) С валидацией вроде знаю как решить. Пока роюсь, что там есть в питоне для таких случаев. В приницпе код что на го, что на пхп примерно одинаков будет по длине
Gerga
Sly32: В приницпе код что на го, что на пхп примерно одинаков будет по длине
На php он может быть еще короче, если не читать посимвольно.
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Text;
namespace Searchengines { class Program {
static void Main(string[] args) { var _sourceArrayItem = new List<char>(); var canRead = false; var firstAppend = true;
using var sr = new StreamReader($"{Environment.CurrentDirectory}\task-1.json"); using var sw = new FileStream($"{Environment.CurrentDirectory}\result.json", FileMode.OpenOrCreate);
var terminalSymbol = Encoding.Default.GetBytes("[");
sw.Write(terminalSymbol, 0, terminalSymbol.Length);
while (sr.Peek() >= 0) { var symbol = (char)sr.Read(); if (symbol == '{' || canRead) { _sourceArrayItem.Add(symbol); canRead = true; } if (symbol == '}') { var item = new string(_sourceArrayItem.ToArray()); var parsedItem = JsonConvert.DeserializeObject<TaskItem>(item);
if (parsedItem.Scores > 0.7) { item = firstAppend ? item : $",{item}"; var buffer = Encoding.Default.GetBytes(item); sw.Write(buffer, 0, buffer.Length); sw.Flush();
firstAppend = false; }
_sourceArrayItem = new List<char>(); canRead = false; } }
danforth
В общем, давно думал сделать тему с задачками для того, чтобы программисты могли прокачивать свой скилл и не ржаветь.
Есть файл с таким содержимым (ссылка на полный файл):
Нужно написать потоковый декодер, который будет парсить файл, отфильтровать объекты, где scores > 0.7, и затем записать эти объекты в файл рядом (тоже потоково). Загружать весь файл полностью и распаковывать в массив нельзя. Изменять структуру файла из задачи нельзя. Выходной формат тоже JSON. Итоговая сортировка не важна. Язык не важен.
onep
Не уверен, что решение правильное. Просто, топ поддержать )
timo-71
Про запись в результата файл сразу не заметил.
Но там несложно, если пустой просто пишем «[{json_encode найденного}]»
дальше идем в конец, находим позицию «]» и с этой позиции дописываем «,{json_encode найденного}]»
Sly32
две строки тут лишние — толкь для подсчета времени
в среднем выполняется за 0.03 сек на core i5 quad
было 10000 строк стало 2995
timo-71
content = data.read()
В задаче запрещено грузить весь файл
Загружать весь файл полностью и распаковывать в массив нельзя.
ziliboba0213
Задал бы я вам квест, да не хочу палиться 🤪 Но там чисто алгоритм, но до сих пор сложить его не могу, умишком слаб :p
Sly32
В задаче запрещено грузить весь файл
да, неправильно в таком случае мое решение
danforth
Sly32, на выходе не валидный json 🙂 Да и вычитано у тебя все в память.
Мое решение на Go, как обычно — самое длинное https://play.golang.org/p/gWg-gqR-Xvi
Sly32
Sly32, на выходе не валидный json Да и вычитано у тебя все в память.
Да, вижу, но пока не нашел красивого решения. не нравиться мне идея читать посимвольно файл руками) С валидацией вроде знаю как решить. Пока роюсь, что там есть в питоне для таких случаев. В приницпе код что на го, что на пхп примерно одинаков будет по длине
Gerga
В приницпе код что на го, что на пхп примерно одинаков будет по длине
На php он может быть еще короче, если не читать посимвольно.
VoV@
Вот решил простым перебором:
Если не грузить сразу в память всё, то ИМХО, только и перебором символов получится.