Мне нужно прочитать файл char с помощью char в swift. То, как я это делаю, - прочитать фрагмент из FileHandler и вернуть первый символ строки.Чтение строкового символа char очень медленно в моей быстрой реализации
Это мой код до сих пор:
/// Return next character, or nil on EOF.
func nextChar() -> Character? {
precondition(fileHandle != nil, "Attempt to read from closed file")
if atEof {
return nil
}
if self.stored.characters.count > 0 {
let c: Character = self.stored.characters.first!
stored.remove(at: self.stored.startIndex)
return c
}
let tmpData = fileHandle.readData(ofLength: (4096))
print("\n---- file read ---\n" , terminator: "")
if tmpData.count == 0 {
return nil
}
self.stored = NSString(data: tmpData, encoding: encoding.rawValue) as String!
let c: Character = self.stored.characters.first!
self.stored.remove(at: stored.startIndex)
return c
}
Моя проблема состоит в том, что возвращение персонажа очень медленно. Это мой тест реализация:
if let aStreamReader = StreamReader(path: file) {
defer {
aStreamReader.close()
}
while let char = aStreamReader.nextChar() {
print("\(char)", terminator: "")
continue
}
}
даже без печати потребовались возрасты, чтобы прочитать файл до конца.
для образца файла с 1,4mb потребовалось больше шести минут, чтобы завершить задачу.
time ./.build/debug/read a.txt
real 6m22.218s
user 6m13.181s
sys 0m2.998s
У вас есть мнение, как ускорить эту часть?
let c: Character = self.stored.characters.first!
stored.remove(at: self.stored.startIndex)
return c
Большое спасибо. пс
++++ UPDATEED ФУНКЦИЯ ++++
func nextChar() -> Character? {
//precondition(fileHandle != nil, "Attempt to read from closed file")
if atEof {
return nil
}
if stored_cnt > (stored_idx + 1) {
stored_idx += 1
return stored[stored_idx]
}
let tmpData = fileHandle.readData(ofLength: (chunkSize))
if tmpData.count == 0 {
atEof = true
return nil
}
if let s = NSString(data: tmpData, encoding: encoding.rawValue) as String! {
stored = s.characters.map { $0 }
stored_idx = 0
stored_cnt = stored.count
}
return stored[0];
}
Используйте инструменты и посмотрите, где все время расходуется. – rmaddy
В трех строках я опубликовал в нижней части сообщения –