Thanks for your answer.
Simon Why are you trying to do memory-mapping on a portable device ? Is it for speed ? Do you absolutely need it ? Yes. even on iDevice, [mmap] can get faster than sequential I/O. Sometime it will be twice faster. Simon Won't the standard SQLite API do the job well enough ? I did use the standard SQLite API. It maps the whole db file into address space. When the db file is too big, the [mmap] will failed and back tosequential I/O method. I have another way to solve this problem. The address space might be“scttered”. There is not enough space to fit a BIG file. But there are a lot of fragment space to fit multiple small region. So I can map multiple regions of file, instead of mapping the whole db file. For example, mapping 128 4MB-regions, instead of mapping the whole 1GB file. This solution should modify the [unixRemapFile] method in the source code of SQLite, also, I should remap the exact region into the pMapRegion variable. In my testcase, I can only [mmap] a db file at most 1.4GB size. But in this new way, I can map a file at most 3.2GB. The test device is iPhone 6S. 原始邮件 发件人:Simon slavinslav...@bigfraud.org 收件人:SQLite mailing listsqlite-us...@mailinglists.sqlite.org 发送时间:2016年8月31日(周三) 14:38 主题:Re: [sqlite] Why MMAP return ENOMEM in SQLite? On 31 Aug 2016, at 4:40am, sanhua.zh sanhua...@foxmail.com wrote: Is it caused by mmap file too big that the address space is not enough? Yes. Under iOS, memory maps can only be as big as the available physical memory. You're working on a tiny multi-tasking device and memory is at a premium. You can't afford to hog memory. Nor can you do data-handling so fast that it runs down the battery or overheats the device. Also, iDevices before the iPhone 5S in 2013 ran a 32-bit version of iOS, limiting them to 4GB of memory per App. If yes, then how can I get the allowed mmap file size? This figure would be useless since available physical memory varies depending on things your application cannot prevent. For instance, you may find out how much free memory there is, but then there may be in incoming phonecall. iOS will then allocate some of that memory to the process dealing with the phonecall. And, of course you cannot do anything to interfere with a phonecall because that is more important than an App. Why are you trying to do memory-mapping on a portable device ? Is it for speed ? Do you absolutely need it ? Won't the standard SQLite API do the job well enough ? Simon. _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users