You just need **8192 B** (64 bit CPU) for you large files. Whenever you 
actually does not need all 16GB data. Try:
    
    
    import os, posix
    
    const
      BufSize = 8192
      filename = "/home/king/test.txt"
    
    var
      pos = 0
      size = 0
      f: File
      buf: array[BufSize, char]
    
    proc flushBuf() =
      if size > 0:
        echo "buf: ", buf, " len: ", len(buf)
      pos = 0
      size = 0
    
    if not open(f, filename, fmRead):
      raise newException(IOError, "could not open")
    
    while true:
      size = f.readBuffer(buf[pos].addr, BufSize - pos)
      if size < 0:
        let lastError = osLastError()
        if lastError.int32 notin {EINTR}:
          continue
      if f.endOfFile():
        flushBuf()
        break
      if size + pos == BufSize:
        flushBuf()
      else:
        inc(pos, size)
    

Reply via email to